diff --git a/visualizer/__init__.py b/visualizer/__init__.py index 35831a0d841d47de45dcfe74cb3ed0d35bd72d5f..1e027a6cca397a8ef2e846526e6bdf2343e63123 100644 --- a/visualizer/__init__.py +++ b/visualizer/__init__.py @@ -1,5 +1,6 @@ from flask import abort, Flask, g, jsonify, redirect, render_template +from .data import measurements from .parameters import get_param, year_type from .plotting import plotters from .records import get_link, get_station, read_stations @@ -30,6 +31,7 @@ def render_plotter(name, embedded): if plotter is None: abort(404) g.embedded = embedded + g.measurements = measurements g.plotters = plotters g.plotter = plotter stations = read_stations() diff --git a/visualizer/data.py b/visualizer/data.py index a3b7e8165c119285e83fa652d6252dcf5df0f7a0..8768b9ee6f9e392ebeaa8379b751b73b4fb1f78e 100644 --- a/visualizer/data.py +++ b/visualizer/data.py @@ -11,11 +11,12 @@ from pyld import jsonld from . import data_spec from .records import get_link -Measurement = make_dataclass('Measurement', ['url_name', 'field', 'title']) -measurements = {m.url_name: m for m in ( - Measurement('temperature', 1, 'Temperature (C)'), - Measurement('pressure', 2, 'Pressure (hPa)'), - Measurement('wind-speed', 3, 'Wind Speed (m/s)'), +Measurement = make_dataclass('Measurement', + ['slug', 'field', 'title', 'units']) +measurements = {m.slug: m for m in ( + Measurement('temperature', 1, 'Temperature', 'C'), + Measurement('pressure', 2, 'Pressure', 'hPa'), + Measurement('wind-speed', 3, 'Wind Speed', 'm/s'), )} # Special JSON property names/values ACCESS_URL = 'http://www.w3.org/ns/dcat#accessURL' diff --git a/visualizer/plotting.py b/visualizer/plotting.py index 69d77615196798a85b1a2def938add6bd6cdc048..f7fa5ee7c860a6888f833f01a50a49ce64a8921a 100644 --- a/visualizer/plotting.py +++ b/visualizer/plotting.py @@ -44,21 +44,22 @@ class TimeSeries(Plotter): xmax=data[:, 0][-1], linestyle='-', alpha=0.7) - axes.set_ylabel(meas.title) + axes.set_ylabel(f'{meas.title} ({meas.units})') axes.grid(True) maximum = max(data, key=lambda row: row[meas.field]) minimum = min(data, key=lambda row: row[meas.field]) axes.set_title( - (f'Max {meas.title}: {maximum[meas.field]}, Date: ({maximum[0]}). ' - f'Min {meas.title}: {minimum[meas.field]}, ' + (f'Max {meas.title} ({meas.units}): {maximum[meas.field]}, ' + f'Date: ({maximum[0]}). ' + f'Min {meas.title} ({meas.units}): {minimum[meas.field]}, ' f'Date: ({minimum[0]}).'), fontsize='small', ) name = station['name'] - plt.suptitle(f'{meas.title} measurements, {name} Station, ' - f'{data[0][0].year}') + plt.suptitle(f'{meas.title} ({meas.units}) measurements, ' + f'{name} Station, {data[0][0].year}') return savefig_response(fig, filename=( - f'{cls.name}.{station_id}.{year}.{meas.url_name}.png' + f'{cls.name}.{station_id}.{year}.{meas.slug}.png' )) @@ -104,7 +105,7 @@ class Overlay(Plotter): xmax=datasets[0].data[:, 0][-1], alpha=0.7, label=f'Avg {dset.name} {dset.data[0][0].year}') - axes.set_ylabel(meas.title) + axes.set_ylabel(f'{meas.title} ({meas.units})') for dset in datasets: dset.max = max(dset.data, key=lambda row: row[meas.field]) @@ -114,20 +115,21 @@ class Overlay(Plotter): axes.grid(True) axes.set_title( - (f'Max {meas.title}: {max_dset.max[meas.field]}, ' + (f'Max {meas.title} ({meas.units}): {max_dset.max[meas.field]}, ' f'{max_dset.name} Station, Date: ({max_dset.max[0]}). ' - f'Min {meas.title}: {min_dset.min[meas.field]}, ' + f'Min {meas.title} ({meas.units}): {min_dset.min[meas.field]}, ' f'{min_dset.name} Station, Date: ({min_dset.min[0]}).'), fontsize='small') axes.legend() axes.tick_params(labelbottom=False) title_dsets = ' / '.join(f'{dset.name} Station, {dset.data[0][0].year}' for dset in datasets) - plt.suptitle(f'{meas.title} measurements, {title_dsets}') + plt.suptitle(f'{meas.title} ({meas.units}) measurements, ' + f'{title_dsets}') filename_dsets = '.'.join(f'{dset.station_id}.{dset.year}' for dset in datasets) return savefig_response(fig, filename=( - f'{cls.name}.{filename_dsets}.{meas.url_name}.png' + f'{cls.name}.{filename_dsets}.{meas.slug}.png' )) @@ -172,19 +174,20 @@ class Boxplot(Plotter): fig.set_figheight(6) fig.set_figwidth(12) axes.boxplot(plot_data, positions=years) - axes.set_ylabel(meas.title) + axes.set_ylabel(f'{meas.title} ({meas.units})') axes.grid(True) axes.set_title( - (f'Max {meas.title}: {maximum[meas.field]}, Date: ({maximum[0]}). ' - f'Min {meas.title}: {minimum[meas.field]}, ' + (f'Max {meas.title} ({meas.units}): {maximum[meas.field]}, ' + f'Date: ({maximum[0]}). ' + f'Min {meas.title} ({meas.units}): {minimum[meas.field]}, ' f'Date: ({minimum[0]}).'), fontsize='small', ) name = station['name'] - plt.suptitle(f'{meas.title} measurements, {name} Station, ' - f'{start_year} - {end_year}.') + plt.suptitle(f'{meas.title} ({meas.units}) measurements, ' + f'{name} Station, {start_year} - {end_year}.') return savefig_response(fig, filename=( - f'{cls.name}.{station_id}.{year1}.{year2}.{meas.url_name}.png' + f'{cls.name}.{station_id}.{year1}.{year2}.{meas.slug}.png' )) diff --git a/visualizer/templates/measurement-options.html b/visualizer/templates/measurement-options.html index 672e6e61eeca6f7a7a9cd7972d232ce4ed55fb8f..71f609d3d9507f236410f67c8ad24a37bf185403 100644 --- a/visualizer/templates/measurement-options.html +++ b/visualizer/templates/measurement-options.html @@ -1,3 +1,5 @@ - <option value="temperature">Temperature</option> - <option value="pressure">Pressure</option> - <option value="wind-speed">Wind Speed</option> +{% for meas in g.measurements.values() %} + <option value="{{ meas.slug }}"> + {{- meas.title -}} + </option> +{% endfor %}