From 961dc387ce6ed7c5f6a6eca11dc82cc71b3b793b Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Mon, 20 Apr 2020 16:48:46 +0200 Subject: [PATCH] [contrasting] add plot annual maxima time series --- .../visualization/main_study_visualizer.py | 3 +- .../altitudes_fit/altitudes_studies.py | 40 ++++++++++++++++++- .../test_altitudes_studies.py | 6 +++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py b/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py index b933c39f..cfc58339 100644 --- a/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py +++ b/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py @@ -9,7 +9,7 @@ from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusD from extreme_data.meteo_france_data.scm_models_data.crocus.crocus_variables import CrocusDensityVariable from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall, ExtendedSafranSnowfall, \ SafranRainfall, \ - SafranTemperature, SafranPrecipitation + SafranTemperature, SafranPrecipitation, SafranSnowfall1Day from extreme_data.meteo_france_data.scm_models_data.visualization.study_visualizer import \ StudyVisualizer from projects.exceeding_snow_loads.section_discussion.crocus_study_comparison_with_eurocode import \ @@ -29,6 +29,7 @@ SCM_STUDIES_NAMES = [get_display_name_from_object_type(k) for k in SCM_STUDIES] SCM_STUDY_NAME_TO_SCM_STUDY = dict(zip(SCM_STUDIES_NAMES, SCM_STUDIES)) SCM_STUDY_CLASS_TO_ABBREVIATION = { SafranSnowfall: 'SF3', + SafranSnowfall1Day: 'SF1', CrocusSweTotal: 'SWE', CrocusSwe3Days: 'SWE3', CrocusSnowLoadEurocode: 'GSL from annual maximum of HS \nand {}'.format(eurocode_snow_density), diff --git a/projects/contrasting_trends_in_snow_loads/altitudes_fit/altitudes_studies.py b/projects/contrasting_trends_in_snow_loads/altitudes_fit/altitudes_studies.py index 727671b1..2296ec69 100644 --- a/projects/contrasting_trends_in_snow_loads/altitudes_fit/altitudes_studies.py +++ b/projects/contrasting_trends_in_snow_loads/altitudes_fit/altitudes_studies.py @@ -4,6 +4,9 @@ from collections import OrderedDict from cached_property import cached_property from extreme_data.meteo_france_data.scm_models_data.abstract_study import AbstractStudy +from extreme_data.meteo_france_data.scm_models_data.visualization.main_study_visualizer import \ + SCM_STUDY_CLASS_TO_ABBREVIATION +from extreme_data.meteo_france_data.scm_models_data.visualization.study_visualizer import StudyVisualizer from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates from spatio_temporal_dataset.coordinates.spatial_coordinates.abstract_spatial_coordinates import \ AbstractSpatialCoordinates @@ -13,6 +16,7 @@ from spatio_temporal_dataset.coordinates.temporal_coordinates.generated_temporal ConsecutiveTemporalCoordinates from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset from spatio_temporal_dataset.spatio_temporal_observations.annual_maxima_observations import AnnualMaxima +import matplotlib.pyplot as plt class AltitudesStudies(object): @@ -20,10 +24,11 @@ class AltitudesStudies(object): def __init__(self, study_class, altitudes, spatial_transformation_class=None, temporal_transformation_class=None, **kwargs_study): + self.study_class = study_class self.spatial_transformation_class = spatial_transformation_class self.temporal_transformation_class = temporal_transformation_class self.altitudes = altitudes - self.altitude_to_study = OrderedDict() # type: OrderedDict[int, AbstractStudy] + self.altitude_to_study = OrderedDict() # type: OrderedDict[int, AbstractStudy] for altitude in self.altitudes: study = study_class(altitude=altitude, **kwargs_study) self.altitude_to_study[altitude] = study @@ -34,7 +39,8 @@ class AltitudesStudies(object): # Dataset Loader - def spatio_temporal_dataset(self, massif_name, s_split_spatial: pd.Series = None, s_split_temporal: pd.Series = None): + def spatio_temporal_dataset(self, massif_name, s_split_spatial: pd.Series = None, + s_split_temporal: pd.Series = None): coordinates = self.spatio_temporal_coordinates(s_split_spatial, s_split_temporal) coordinate_values_to_maxima = {} for altitude in self.altitudes: @@ -77,3 +83,33 @@ class AltitudesStudies(object): def random_s_split_temporal(self, train_split_ratio): return AbstractCoordinates.temporal_s_split_from_df(self._df_coordinates, train_split_ratio) + + # Some visualization + + def show_or_save_to_file(self, plot_name, show=False): + study_visualizer = StudyVisualizer(study=self.study, show=show, save_to_file=not show) + study_visualizer.plot_name = plot_name + study_visualizer.show_or_save_to_file(add_classic_title=False) + + def plot_maxima_time_series(self, massif_names=None, show=False): + massif_names = massif_names if massif_names is not None else self.study.all_massif_names() + assert isinstance(massif_names, list) + for massif_name in massif_names: + self._plot_maxima_time_series(massif_name, show=show) + + def _plot_maxima_time_series(self, massif_name, show=False): + ax = plt.gca() + linewidth = 5 + x = self.study.ordered_years + for altitude, study in self.altitude_to_study.items(): + y = study.massif_name_to_annual_maxima[massif_name] + label = '{} m'.format(altitude) + ax.plot(x, y, linewidth=linewidth, label=label) + ax.xaxis.set_ticks(x[1::10]) + ax.tick_params(axis='both', which='major', labelsize=13) + ax.legend() + plot_name = 'Annual maxima of {} in {}'.format(SCM_STUDY_CLASS_TO_ABBREVIATION[self.study_class], massif_name) + ax.set_ylabel('{} ({})'.format(plot_name, self.study.variable_unit), fontsize=15) + ax.set_xlabel('years', fontsize=15) + self.show_or_save_to_file(plot_name=plot_name, show=show) + ax.clear() diff --git a/test/test_projects/test_contrasting/test_altitudes_studies.py b/test/test_projects/test_contrasting/test_altitudes_studies.py index ed3cb272..8f437cb1 100644 --- a/test/test_projects/test_contrasting/test_altitudes_studies.py +++ b/test/test_projects/test_contrasting/test_altitudes_studies.py @@ -17,6 +17,12 @@ class TestAltitudesStudies(unittest.TestCase): self.studies = AltitudesStudies(study_class, altitudes, year_min=1959, year_max=1962) +class TestVisualization(TestAltitudesStudies): + + def test_plot_maxima_time_series(self): + self.studies.plot_maxima_time_series(massif_names=['Vercors'], show=False) + + class TestSpatioTemporalCoordinates(TestAltitudesStudies): def test_temporal_split(self): -- GitLab