From 908473dfc53fab93964e266c446470e6364ce844 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Wed, 22 Jan 2020 15:47:50 +0100
Subject: [PATCH] [paper 2] improve plot trend curves. improve swe plots for
 appendix examples

---
 .../study_visualization/study_visualizer.py   |  4 +--
 .../data/main_example_swe_total_plot.py       | 22 ++++++++------
 .../paper_past_snow_loads/paper_utils.py      |  3 +-
 .../main_result_trends_and_return_levels.py   | 29 +++++--------------
 .../plot_trend_curves.py                      | 25 ++++++++++++++--
 5 files changed, 46 insertions(+), 37 deletions(-)

diff --git a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py
index d6da42c2..a346d59a 100644
--- a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py
+++ b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py
@@ -627,7 +627,7 @@ class StudyVisualizer(VisualizationParameters):
 
     def visualize_max_graphs_poster(self, massif_name, altitude, snow_abbreviation, color,
                                     label=None, last_plot=True, ax=None, linestyle=None,
-                                    tight_pad=None, dpi=None):
+                                    tight_pad=None, dpi=None, linewidth=5):
         massif_names = self.study.study_massif_names
         # Display the graph of the max on top
         if ax is None:
@@ -636,7 +636,7 @@ class StudyVisualizer(VisualizationParameters):
             x, y = self.study.ordered_years, self.study.observations_annual_maxima.df_maxima_gev.mean(axis=0)
         else:
             x, y = self.smooth_maxima_x_y(massif_names.index(massif_name))
-        ax.plot(x, y, color=color, linewidth=5, label=label, linestyle=linestyle)
+        ax.plot(x, y, color=color, linewidth=linewidth, label=label, linestyle=linestyle)
         # ax.set_ylabel('{} (in {})'.format(snow_abbreviation, self.study.variable_unit), color=color, fontsize=15)
 
         ax.xaxis.set_ticks(x[2::10])
diff --git a/experiment/paper_past_snow_loads/data/main_example_swe_total_plot.py b/experiment/paper_past_snow_loads/data/main_example_swe_total_plot.py
index eb32d1cc..f8560edf 100644
--- a/experiment/paper_past_snow_loads/data/main_example_swe_total_plot.py
+++ b/experiment/paper_past_snow_loads/data/main_example_swe_total_plot.py
@@ -8,8 +8,6 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat
 from experiment.paper_past_snow_loads.paper_utils import dpi_paper1_figure
 
 
-
-
 def tuples_for_examples_paper1(examples_for_the_paper=True):
     if examples_for_the_paper:
 
@@ -20,12 +18,13 @@ def tuples_for_examples_paper1(examples_for_the_paper=True):
         ]
     else:
         marker_altitude_massif_name_for_paper1 = [
-            ('yellow', 600, 'Ubaye'),
-            ('purple', 600, 'Parpaillon'),
+            ('magenta', 600, 'Ubaye'),
+            ('darkmagenta', 600, 'Parpaillon'),
+            ('mediumpurple', 300, 'Aravis'),
         ]
     return marker_altitude_massif_name_for_paper1
 
-tuples_for_examples_paper1()
+
 
 def max_graph_annual_maxima_poster():
     """
@@ -36,11 +35,15 @@ def max_graph_annual_maxima_poster():
     save_to_file = True
     study_class = CrocusSnowLoadTotal
 
-    examples_for_the_paper = True
+    examples_for_the_paper = False
 
     ax = plt.gca()
-    ax.set_ylim([0, 20])
-    ax.set_yticks(list(range(0, 21, 2)))
+    if examples_for_the_paper:
+        ax.set_ylim([0, 20])
+        ax.set_yticks(list(range(0, 21, 2)))
+        linewidth = 5
+    else:
+        linewidth = 3
 
     marker_altitude_massif_name_for_paper1 = tuples_for_examples_paper1(examples_for_the_paper)
 
@@ -55,7 +58,8 @@ def max_graph_annual_maxima_poster():
             tight_pad = {'h_pad': 0.2}
             study_visualizer.visualize_max_graphs_poster(massif_name, altitude, snow_abbreviation, color, label,
                                                          last_plot, ax, tight_pad=tight_pad,
-                                                         dpi=dpi_paper1_figure)
+                                                         dpi=dpi_paper1_figure,
+                                                         linewidth=linewidth)
 
 
 if __name__ == '__main__':
diff --git a/experiment/paper_past_snow_loads/paper_utils.py b/experiment/paper_past_snow_loads/paper_utils.py
index ffcee10d..5a45a996 100644
--- a/experiment/paper_past_snow_loads/paper_utils.py
+++ b/experiment/paper_past_snow_loads/paper_utils.py
@@ -6,9 +6,8 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat
     ALL_ALTITUDES_WITHOUT_NAN
 from root_utils import get_display_name_from_object_type
 
-# paper_altitudes = [300, 600, 900, 1200, 1500, 1800, 2100, 2400, 2700]
 paper_altitudes = ALL_ALTITUDES_WITHOUT_NAN
-paper_study_classes = [CrocusSnowLoadTotal, CrocusSnowLoadEurocode, CrocusSnowLoad3Days]
+paper_study_classes = [CrocusSnowLoadTotal, CrocusSnowLoadEurocode, CrocusSnowLoad3Days][:2]
 # dpi_paper1_figure = 700
 dpi_paper1_figure = None
 
diff --git a/experiment/paper_past_snow_loads/result_trends_and_return_levels/main_result_trends_and_return_levels.py b/experiment/paper_past_snow_loads/result_trends_and_return_levels/main_result_trends_and_return_levels.py
index ca4f924b..407fae9e 100644
--- a/experiment/paper_past_snow_loads/result_trends_and_return_levels/main_result_trends_and_return_levels.py
+++ b/experiment/paper_past_snow_loads/result_trends_and_return_levels/main_result_trends_and_return_levels.py
@@ -8,7 +8,8 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat
     ALL_ALTITUDES_WITHOUT_NAN
 from experiment.paper_past_snow_loads.paper_main_utils import load_altitude_to_visualizer
 from experiment.paper_past_snow_loads.paper_utils import paper_study_classes, paper_altitudes, ModelSubsetForUncertainty
-from experiment.paper_past_snow_loads.result_trends_and_return_levels.plot_trend_curves import plot_trend_curves
+from experiment.paper_past_snow_loads.result_trends_and_return_levels.plot_trend_curves import plot_trend_curves, \
+    plot_trend_map
 from experiment.paper_past_snow_loads.result_trends_and_return_levels.plot_uncertainty_curves import \
     plot_uncertainty_massifs
 from experiment.paper_past_snow_loads.result_trends_and_return_levels.plot_uncertainty_histogram import \
@@ -65,25 +66,11 @@ def intermediate_result(altitudes, massif_names=None,
     else:
         for visualizer in visualizers:
             _ = compute_minimized_aic(visualizer)
-    # Compute common max value for the colorbar
-    max_abs_tdrl = max([visualizer.max_abs_change for altitude, visualizer in altitude_to_visualizer.items()
-                        if altitude >= 900])
-    for altitude, visualizer in altitude_to_visualizer.items():
-        if 900 <= altitude <= 4200:
-            add_color = (visualizer.study.altitude - 1500) % 900 == 0
-            visualizer.plot_trends(max_abs_tdrl, add_colorbar=add_color)
-            # Plot 2700 also with a colorbar
-            if altitude == 2700:
-                visualizer.plot_trends(max_abs_tdrl, add_colorbar=True)
-        else:
-            visualizer.plot_trends(None, add_colorbar=True)
 
-    # Plot trends
-    altitude_to_visualizer_for_plot_trend = {a: v for a, v in altitude_to_visualizer.items() if a >= 900}
-    plot_trend_curves(altitude_to_visualizer_for_plot_trend)
-    # Plot graph
+    # Plots
+    plot_trend_map(altitude_to_visualizer)
+    # plot_trend_curves(altitude_to_visualizer={a: v for a, v in altitude_to_visualizer.items() if a >= 900})
     # plot_uncertainty_massifs(altitude_to_visualizer)
-    # # Plot histogram
     # plot_uncertainty_histogram(altitude_to_visualizer)
 
 
@@ -91,7 +78,7 @@ def major_result():
     uncertainty_methods = [ConfidenceIntervalMethodFromExtremes.my_bayes,
                            ConfidenceIntervalMethodFromExtremes.ci_mle][1:]
     massif_names = None
-    study_classes = paper_study_classes[:2]
+    study_classes = paper_study_classes[:1]
     # model_subsets_for_uncertainty = [ModelSubsetForUncertainty.stationary_gumbel,
     #                                  ModelSubsetForUncertainty.stationary_gumbel_and_gev,
     #                                  ModelSubsetForUncertainty.non_stationary_gumbel,
@@ -105,7 +92,7 @@ def major_result():
 
 if __name__ == '__main__':
     # major_result()
-    intermediate_result(altitudes=ALL_ALTITUDES_WITHOUT_NAN[2:], massif_names=None,
+    intermediate_result(altitudes=ALL_ALTITUDES_WITHOUT_NAN[:2], massif_names=None,
                         uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.my_bayes,
                                              ConfidenceIntervalMethodFromExtremes.ci_mle][1:],
                         multiprocessing=True)
@@ -134,4 +121,4 @@ if __name__ == '__main__':
     #                     non_stationary_uncertainty=[False, True])
     # intermediate_result(altitudes=[300, 600, 900], massif_names=None,
     #                     uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.ci_mle],
-    #                     non_stationary_uncertainty=[False, True])
\ No newline at end of file
+    #                     non_stationary_uncertainty=[False, True])
diff --git a/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_trend_curves.py b/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_trend_curves.py
index 4e3d7de0..382c271f 100644
--- a/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_trend_curves.py
+++ b/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_trend_curves.py
@@ -8,6 +8,25 @@ from experiment.paper_past_snow_loads.study_visualizer_for_non_stationary_trends
     StudyVisualizerForNonStationaryTrends
 
 
+def plot_trend_map(altitude_to_visualizer):
+    # Compute common max value for the colorbar
+    max_abs_changes_above_900 = [visualizer.max_abs_change
+                       for altitude, visualizer in altitude_to_visualizer.items()
+                       if altitude >= 900]
+    max_abs_tdrl_above_900 = max(max_abs_changes_above_900) if len(max_abs_changes_above_900) > 0 else None
+
+    max_abs_tdrl_below_900 = max(altitude_to_visualizer[300].max_abs_change, altitude_to_visualizer[600].max_abs_change)
+    for altitude, visualizer in altitude_to_visualizer.items():
+        if 900 <= altitude <= 4200:
+            add_color = (visualizer.study.altitude - 1500) % 900 == 0
+            visualizer.plot_trends(max_abs_tdrl_above_900, add_colorbar=add_color)
+            # Plot 2700 also with a colorbar
+            if altitude == 2700:
+                visualizer.plot_trends(max_abs_tdrl_above_900, add_colorbar=True)
+        else:
+            visualizer.plot_trends(max_abs_tdrl_below_900, add_colorbar=altitude==600)
+
+
 def plot_trend_curves(altitude_to_visualizer: Dict[int, StudyVisualizerForNonStationaryTrends]):
     """
     Plot a single trend curves
@@ -47,9 +66,9 @@ def plot_trend_curves(altitude_to_visualizer: Dict[int, StudyVisualizerForNonSta
 
     # Set the number of massifs on the upper axis
     ax_twiny.set_xticklabels([v.study.nb_study_massif_names for v in altitude_to_visualizer.values()])
-    ax_twiny.set_xlabel('Total number of massif at each altitude (for the percentage)', fontsize=legend_fontsize)
+    ax_twiny.set_xlabel('Total number of massifs at each altitude (for the percentage)', fontsize=legend_fontsize)
 
-    ax.set_ylabel('Percentage of massifs with decreasing trend (\%)', fontsize=legend_fontsize)
+    ax.set_ylabel('Massifs with decreasing trend (\%)', fontsize=legend_fontsize)
     max_percent = int(max(percent_decrease))
     n = 2 + (max_percent // 10)
     ax_ticks = [10 * i for i in range(n)]
@@ -68,7 +87,7 @@ def plot_trend_curves(altitude_to_visualizer: Dict[int, StudyVisualizerForNonSta
         if len(mean_decreases) > 1:
             label = region_name
         else:
-            label = 'Mean decrease'
+            label = 'Mean relative decrease'
         ax_twinx.plot(altitudes, mean_decrease, label=label, linewidth=linewidth, marker='o')
         ax_twinx.legend(loc='upper right', prop={'size': size})
 
-- 
GitLab