From e4bc0446cdda173e9c00fe0ed128f58880590c50 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Tue, 31 Mar 2020 19:27:32 +0200
Subject: [PATCH] [contrasting project] add
 plot_contrasting_trend_curves_massif

---
 .../main_result.py                            | 12 ++--
 .../plot_contrasting_trend_curves.py          | 63 ++++++++++++++++++-
 .../snow_load_impact/__init__.py              |  0
 .../short_snow_load_partition.py              |  5 +-
 4 files changed, 73 insertions(+), 7 deletions(-)
 create mode 100644 projects/contrasting_trends_in_snow_loads/snow_load_impact/__init__.py
 rename projects/contrasting_trends_in_snow_loads/{ => snow_load_impact}/short_snow_load_partition.py (98%)

diff --git a/projects/contrasting_trends_in_snow_loads/main_result.py b/projects/contrasting_trends_in_snow_loads/main_result.py
index 6dbcde6a..ec17b4e1 100644
--- a/projects/contrasting_trends_in_snow_loads/main_result.py
+++ b/projects/contrasting_trends_in_snow_loads/main_result.py
@@ -19,7 +19,8 @@ from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusS
     CrocusSnowLoad5Days, CrocusSnowLoad7Days, CrocusSnowLoad1Day
 from extreme_fit.model.result_from_model_fit.result_from_extremes.confidence_interval_method import \
     ConfidenceIntervalMethodFromExtremes
-from projects.contrasting_trends_in_snow_loads.plot_contrasting_trend_curves import plot_contrasting_trend_curves
+from projects.contrasting_trends_in_snow_loads.plot_contrasting_trend_curves import plot_contrasting_trend_curves, \
+    plot_contrasting_trend_curves_massif
 from projects.exceeding_snow_loads.section_results.main_result_trends_and_return_levels import \
     compute_minimized_aic
 from root_utils import NB_CORES
@@ -49,14 +50,16 @@ def intermediate_result(altitudes, massif_names=None,
     # Compute minimized value efficiently
     visualizers = list(altitude_to_visualizer.values())
     if multiprocessing:
-        with Pool(NB_CORES) as p:
+        with Pool(4) as p:
             _ = p.map(compute_minimized_aic, visualizers)
     else:
         for visualizer in visualizers:
             _ = compute_minimized_aic(visualizer)
 
     # Plots
-    plot_contrasting_trend_curves(altitude_to_visualizer, all_regions=True)
+    # plot_contrasting_trend_curves(altitude_to_visualizer, all_regions=True)
+    plot_contrasting_trend_curves_massif(altitude_to_visualizer, all_regions=True)
+
 
 def major_result():
     uncertainty_methods = [ConfidenceIntervalMethodFromExtremes.my_bayes,
@@ -73,10 +76,11 @@ def major_result():
     rainfall_classes = [SafranRainfall1Day, SafranRainfall3Days, SafranRainfall5Days, SafranRainfall7Days]
     study_classes = precipitation_classes + snow_load_classes
     # study_classes = snowfall_classes + rainfall_classes
-    for study_class in snowfall_classes:
+    for study_class in snowfall_classes[:1]:
         intermediate_result(altitudes, massif_names, model_subsets_for_uncertainty,
                             uncertainty_methods, study_class, multiprocessing=True)
 
+
 """
 
 est ce qu il y a une croissance signifcative en pluie, 
diff --git a/projects/contrasting_trends_in_snow_loads/plot_contrasting_trend_curves.py b/projects/contrasting_trends_in_snow_loads/plot_contrasting_trend_curves.py
index a84ca2f9..1a75bb42 100644
--- a/projects/contrasting_trends_in_snow_loads/plot_contrasting_trend_curves.py
+++ b/projects/contrasting_trends_in_snow_loads/plot_contrasting_trend_curves.py
@@ -8,6 +8,67 @@ from extreme_trend.visualizers.study_visualizer_for_non_stationary_trends import
     StudyVisualizerForNonStationaryTrends
 
 
+def plot_contrasting_trend_curves_massif(altitude_to_visualizer: Dict[int, StudyVisualizerForNonStationaryTrends],
+                                  all_regions=False):
+    """
+    Plot a single trend curves
+    :return:
+    """
+    visualizers = list(altitude_to_visualizer.values())
+    visualizer = visualizers[0]
+    altitudes = list(altitude_to_visualizer.keys())
+
+    ax = create_adjusted_axes(1, 1)
+    # ax_twinx = ax.twinx()
+    ax_twinx = ax
+    ax_twiny = ax.twiny()
+
+    # parameters
+    width = 150
+    size = 20
+    legend_fontsize = 20
+    color = 'white'
+    labelsize = 15
+    linewidth = 3
+
+    for ax_horizontal in [ax, ax_twiny]:
+        if ax_horizontal == ax_twiny:
+            ax_horizontal.plot(altitudes, [0 for _ in altitudes], linewidth=0)
+        else:
+            ax_horizontal.set_xlabel('Altitude', fontsize=legend_fontsize)
+        ax_horizontal.set_xticks(altitudes)
+        # ax_horizontal.set_xlim([700, 5000])
+        ax_horizontal.tick_params(labelsize=labelsize)
+
+    # 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 massifs at each altitude (for the percentage)', fontsize=legend_fontsize)
+
+    ax_twinx.yaxis.grid()
+
+    ax_twinx.set_ylabel(visualizer.label, fontsize=legend_fontsize)
+    for j, massif_name in enumerate(visualizer.study.study_massif_names):
+        massif_visualizers = [v for v in visualizers if massif_name in v.massif_name_to_change_value]
+        changes = [v.massif_name_to_relative_change_value[massif_name] for v in massif_visualizers]
+        massif_altitudes = [v.study.altitude for v in massif_visualizers]
+        label = massif_name.replace('-', '').replace('_', '')
+        if j < 10:
+            linestyle = 'solid'
+        elif j < 20:
+            linestyle = 'dashed'
+        else:
+            linestyle = 'dotted'
+        ax_twinx.plot(massif_altitudes, changes, label=label, linewidth=linewidth, marker='o', linestyle=linestyle)
+        ax_twinx.legend(loc='upper right', prop={'size': 5})
+
+    ax.axhline(y=0, color='k')
+
+    # Save plot
+    visualizer.plot_name = 'Trend curves for' + visualizer.study.variable_name
+    visualizer.show_or_save_to_file(no_title=True, dpi=dpi_paper1_figure, folder_for_variable=False)
+    plt.close()
+
+
 def plot_contrasting_trend_curves(altitude_to_visualizer: Dict[int, StudyVisualizerForNonStationaryTrends],
                                   all_regions=False):
     """
@@ -21,7 +82,7 @@ def plot_contrasting_trend_curves(altitude_to_visualizer: Dict[int, StudyVisuali
     ax_twinx = ax
     ax_twiny = ax.twiny()
 
-    trend_summary_values = list(zip(*[v.trend_summary_contrasting_values(all_regions=all_regions) for v in altitude_to_visualizer.values()]))
+    trend_summary_values = list(zip(*[v.trend_summary_contrasting_values(regions=all_regions) for v in altitude_to_visualizer.values()]))
     altitudes, *mean_changes = trend_summary_values
 
     # parameters
diff --git a/projects/contrasting_trends_in_snow_loads/snow_load_impact/__init__.py b/projects/contrasting_trends_in_snow_loads/snow_load_impact/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/projects/contrasting_trends_in_snow_loads/short_snow_load_partition.py b/projects/contrasting_trends_in_snow_loads/snow_load_impact/short_snow_load_partition.py
similarity index 98%
rename from projects/contrasting_trends_in_snow_loads/short_snow_load_partition.py
rename to projects/contrasting_trends_in_snow_loads/snow_load_impact/short_snow_load_partition.py
index 5405c294..ee3aaca3 100644
--- a/projects/contrasting_trends_in_snow_loads/short_snow_load_partition.py
+++ b/projects/contrasting_trends_in_snow_loads/snow_load_impact/short_snow_load_partition.py
@@ -69,7 +69,7 @@ def main_snow_load_maxima_partition(year_min, year_max):
     rainfall_classes = [SafranRainfall1Day, SafranRainfall3Days, SafranRainfall5Days, SafranRainfall7Days]
     snowfall_classes = [SafranSnowfall1Day, SafranSnowfall3Days, SafranSnowfall5Days, SafranSnowfall7Days]
     snow_load_classes = [CrocusSnowLoad1Day, CrocusSnowLoad3Days, CrocusSnowLoad5Days, CrocusSnowLoad7Days]
-    classes = list(zip(rainfall_classes, snowfall_classes, snow_load_classes))[:1]
+    classes = list(zip(rainfall_classes, snowfall_classes, snow_load_classes))[1:2]
     nb_top = 5
     for study_classes in classes:
         altitude_to_s = OrderedDict()
@@ -85,8 +85,9 @@ def main_snow_load_maxima_partition(year_min, year_max):
             # print(s)
             altitude_to_s[altitude] = s
         df_final = pd.DataFrame(altitude_to_s).transpose().round(2)
-        print(nb_top)
+        print(nb_top, year_min, year_max)
         print(df_final)
+        print('\n\n')
 
 
 if __name__ == '__main__':
-- 
GitLab