From ddefbb67755e07711229d429ce9d3c46ed5f8520 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Mon, 15 Jul 2019 14:07:49 +0200
Subject: [PATCH] [HYPERCUBE VISUALIZATION] improve trend repartition for
 poster by printing the optimal year. plot in higher resolution with text on
 the figure

---
 .../scm_models_data/abstract_study.py         |  3 +-
 .../abstract_hypercube_visualizer.py          |  2 +-
 .../altitude_hypercube_visualizer.py          | 29 +++++++++++--------
 .../main_starting_years.py                    | 24 +++++++++++----
 4 files changed, 39 insertions(+), 19 deletions(-)

diff --git a/experiment/meteo_france_data/scm_models_data/abstract_study.py b/experiment/meteo_france_data/scm_models_data/abstract_study.py
index 684c8ee4..4cf99e10 100644
--- a/experiment/meteo_france_data/scm_models_data/abstract_study.py
+++ b/experiment/meteo_france_data/scm_models_data/abstract_study.py
@@ -299,7 +299,8 @@ class AbstractStudy(object):
                 x, y = list(row)
                 massif_name = row.name
                 value = massif_name_to_value[massif_name]
-                ax.text(x, y, str(round(value, 1)))
+                str_value = str(round(value, 1)) if isinstance(value, str) else str(value)
+                ax.text(x, y, str_value, horizontalalignment='center', verticalalignment='center', fontsize=7)
 
         if scaled:
             plt.axis('scaled')
diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/abstract_hypercube_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/abstract_hypercube_visualizer.py
index a03e2740..abffff98 100644
--- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/abstract_hypercube_visualizer.py
+++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/abstract_hypercube_visualizer.py
@@ -110,7 +110,7 @@ class AbstractHypercubeVisualizer(object):
             if not op.exists(dirname):
                 os.makedirs(dirname, exist_ok=True)
             if tight:
-                plt.savefig(filepath, bbox_inches='tight', pad_inches=-0.03)
+                plt.savefig(filepath, bbox_inches='tight', pad_inches=-0.03, dpi=1000)
             else:
                 plt.savefig(filepath)
         else:
diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py
index 3c39ac8d..54c55926 100644
--- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py
+++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py
@@ -274,12 +274,12 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer):
 
     def visualize_trend_test_repartition_poster(self, reduction_function, axes=None, subtitle='', isin_parameters=None,
                                                 plot_title=None):
-        ax = axes
-        i = 0
-        trend_type_to_serie = {k: v[i].replace(0.0, np.nan) for k, v in
+        trend_type_to_serie = {k: v[0].replace(0.0, np.nan) for k, v in
                                self.trend_type_to_series(reduction_function, isin_parameters).items()}
 
         massif_to_color = {}
+        add_text = self.nb_rows > 1
+        massif_to_year = {}
         poster_trend_types = [AbstractUnivariateTest.SIGNIFICATIVE_POSITIVE_TREND,
                               AbstractUnivariateTest.SIGNIFICATIVE_NEGATIVE_TREND,
                               AbstractUnivariateTest.NON_SIGNIFICATIVE_TREND][:2]
@@ -287,15 +287,18 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer):
             if display_trend_type in poster_trend_types:
                 color = style[:1]
                 serie = trend_type_to_serie[display_trend_type]
-                massif_to_value = dict(serie)
-                massif_to_color.update({k: color for k, v in massif_to_value.items() if not np.isnan(v)})
-
-        self.study.visualize_study(ax, massif_name_to_color=massif_to_color, show=False,
-                                   show_label=False, scaled=True)
+                massif_to_color_for_trend_type = {k: color for k, v in dict(serie).items() if not np.isnan(v)}
+                massif_to_color.update(massif_to_color_for_trend_type)
+                if add_text:
+                    massif_to_year_for_trend_type = {k: int(v) for k, v in
+                                                     self.trend_type_to_series(reduction_function, isin_parameters)[
+                                                         display_trend_type][1].items()
+                                                     if k in massif_to_color_for_trend_type}
+                    massif_to_year.update(massif_to_year_for_trend_type)
+        self.study.visualize_study(None, massif_name_to_color=massif_to_color, show=False,
+                                   show_label=False, scaled=True, add_text=add_text,
+                                   massif_name_to_value=massif_to_year)
 
-        # ax('scaled')
-        # if plot_title is not None:
-        #     ax.set_title(plot_title)
         title = self.set_trend_test_reparition_title(subtitle, set=False)
 
         # row_title = self.get_title_plot(xlabel='massifs', ax_idx=i)
@@ -306,7 +309,9 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer):
     def set_trend_test_reparition_title(self, subtitle, set=True):
         # Global information
         title = 'Repartition of {} trends'.format(subtitle)
-        title += ' at altitude={}m for the starting_year={}'.format(self.altitudes[0], self.starting_years[0])
+        title += ' at altitude={}m for the starting_year={}'.format(self.altitudes[0], self.first_starting_year)
+        if len(self.starting_years) > 1:
+            title += ' until starting_year={}'.format(self.last_starting_year)
         if set:
             plt.suptitle(title)
         return title
diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files_after_conf/main_starting_years.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files_after_conf/main_starting_years.py
index 9a1a7811..2125580e 100644
--- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files_after_conf/main_starting_years.py
+++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files_after_conf/main_starting_years.py
@@ -32,24 +32,38 @@ def get_fast_altitude_visualizer(altitude_hypercube_class):
 
 def main_fast_spatial_repartition():
     # Simply the main graph
-    get_fast_altitude_visualizer(Altitude_Hypercube_Year_Visualizer).visualize_massif_trend_test()
+    get_fast_altitude_visualizer(Altitude_Hypercube_Year_Visualizer).visualize_massif_trend_test_one_altitude()
 
 
-def get_full_altitude_visualizer(altitude_hypercube_class):
-    altitudes, first_starting_year, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class = get_full_parameters(altitude=900)
+def get_full_altitude_visualizer(altitude_hypercube_class, exact_starting_year=None, altitude=900):
+    altitudes, first_starting_year, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class = get_full_parameters(
+        altitude=altitude)
+    if exact_starting_year is not None:
+        first_starting_year, last_starting_year = None, None
     study_classes = [CrocusRecentSwe]
     visualizer = load_altitude_visualizer(altitude_hypercube_class, altitudes, last_starting_year,
                                           nb_data_reduced_for_speed, only_first_one, save_to_file, study_classes,
-                                          trend_test_class, first_starting_year=first_starting_year)
+                                          trend_test_class, first_starting_year=first_starting_year,
+                                          exact_starting_year=exact_starting_year)
     return visualizer
 
 
+FULL_ALTITUDES = [900, 1500, 2100, 2700]
+
+
 def main_full_spatial_repartition():
-    get_full_altitude_visualizer(Altitude_Hypercube_Year_Visualizer).visualize_massif_trend_test()
+    for altitude in FULL_ALTITUDES[:]:
+        # Compute for the most likely starting year
+        vizualiser = get_full_altitude_visualizer(Altitude_Hypercube_Year_Visualizer, altitude=altitude)
+        vizualiser.visualize_massif_trend_test_one_altitude()
+        # Compute the trend for a linear trend
+        vizualiser = get_full_altitude_visualizer(Altitude_Hypercube_Year_Visualizer, altitude=altitude, exact_starting_year=1958)
+        vizualiser.visualize_massif_trend_test_one_altitude()
 
 
 def main_run():
     main_full_spatial_repartition()
+    # main_fast_spatial_repartition()
 
 
 if __name__ == '__main__':
-- 
GitLab