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