From 60d5976ad4de223556181f6ae821547cca18a6a9 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Wed, 4 Mar 2020 12:53:22 +0100
Subject: [PATCH] [paper 1] fix main plots for the paper

---
 .../shape/main_shape_repartition.py           |  4 ++--
 .../exceeding_snow_loads/paper_main_utils.py  |  9 +++----
 .../main_result_trends_and_return_levels.py   | 14 +++++------
 .../plot_selection_curves.py                  | 12 +++++-----
 .../plot_trend_curves.py                      |  4 ++--
 .../plot_uncertainty_curves.py                |  2 +-
 .../plot_uncertainty_histogram.py             | 24 +++++++++++++++----
 ...dy_visualizer_for_non_stationary_trends.py | 10 ++++++--
 8 files changed, 49 insertions(+), 30 deletions(-)

diff --git a/papers/exceeding_snow_loads/check_mle_convergence_for_trends/shape/main_shape_repartition.py b/papers/exceeding_snow_loads/check_mle_convergence_for_trends/shape/main_shape_repartition.py
index 846d1aae..3ba5be62 100644
--- a/papers/exceeding_snow_loads/check_mle_convergence_for_trends/shape/main_shape_repartition.py
+++ b/papers/exceeding_snow_loads/check_mle_convergence_for_trends/shape/main_shape_repartition.py
@@ -27,8 +27,8 @@ def main_shape_repartition(altitudes, massif_names=None,
 
 if __name__ == '__main__':
     # main_shape_repartition([900], save_to_file=False)
-    # main_shape_repartition([900, 1800, 2700])
+    main_shape_repartition([900, 1800, 2700])
     # main_shape_repartition([300, 600, 900, 1200, 1500, 1800, 2700])
-    main_shape_repartition(paper_altitudes, study_visualizer_class=StudyVisualizerForShape, save_to_file=True)
+    # main_shape_repartition(paper_altitudes, study_visualizer_class=StudyVisualizerForShape, save_to_file=True)
     # main_shape_repartition([300, 600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600, 3900, 4200],
     #                        study_visualizer_class=StudyVisualizerForShape, save_to_file=True)
diff --git a/papers/exceeding_snow_loads/paper_main_utils.py b/papers/exceeding_snow_loads/paper_main_utils.py
index 4b5fc27d..fabaea8a 100644
--- a/papers/exceeding_snow_loads/paper_main_utils.py
+++ b/papers/exceeding_snow_loads/paper_main_utils.py
@@ -11,16 +11,13 @@ def load_altitude_to_visualizer(altitudes, massif_names, model_subsets_for_uncer
                                 study_visualizer_class=StudyVisualizerForNonStationaryTrends,
                                 save_to_file=True):
     fit_method = TemporalMarginFitMethod.extremes_fevd_mle
-    select_only_acceptable_shape_parameter = True
-    print('Fit method: {}, Select only acceptable shape parameter: {}'
-          .format(fit_method, select_only_acceptable_shape_parameter))
     altitude_to_visualizer = OrderedDict()
     for altitude in altitudes:
         altitude_to_visualizer[altitude] = study_visualizer_class(
             study=study_class(altitude=altitude), multiprocessing=True, save_to_file=save_to_file,
             uncertainty_massif_names=massif_names, uncertainty_methods=uncertainty_methods,
             model_subsets_for_uncertainty=model_subsets_for_uncertainty, fit_method=fit_method,
-            select_only_acceptable_shape_parameter=select_only_acceptable_shape_parameter)
+            select_only_acceptable_shape_parameter=True,
+            fit_gev_only_on_non_null_maxima=False,
+            fit_only_time_series_with_ninety_percent_of_non_null_values=True)
     return altitude_to_visualizer
-
-
diff --git a/papers/exceeding_snow_loads/result_trends_and_return_levels/main_result_trends_and_return_levels.py b/papers/exceeding_snow_loads/result_trends_and_return_levels/main_result_trends_and_return_levels.py
index 12e04ac9..8826ac1e 100644
--- a/papers/exceeding_snow_loads/result_trends_and_return_levels/main_result_trends_and_return_levels.py
+++ b/papers/exceeding_snow_loads/result_trends_and_return_levels/main_result_trends_and_return_levels.py
@@ -69,7 +69,7 @@ def intermediate_result(altitudes, massif_names=None,
     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_uncertainty_histogram(altitude_to_visualizer)
+    plot_uncertainty_histogram(altitude_to_visualizer)
     # plot_selection_curves(altitude_to_visualizer)
 
 
@@ -77,7 +77,7 @@ def major_result():
     uncertainty_methods = [ConfidenceIntervalMethodFromExtremes.my_bayes,
                            ConfidenceIntervalMethodFromExtremes.ci_mle][1:]
     massif_names = None
-    study_classes = paper_study_classes[:1]
+    study_classes = paper_study_classes[:2]
     # model_subsets_for_uncertainty = [ModelSubsetForUncertainty.stationary_gumbel,
     #                                  ModelSubsetForUncertainty.stationary_gumbel_and_gev,
     #                                  ModelSubsetForUncertainty.non_stationary_gumbel,
@@ -90,11 +90,11 @@ def major_result():
 
 
 if __name__ == '__main__':
-    # major_result()
-    intermediate_result(altitudes=[1800], massif_names=None,
-                        uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.my_bayes,
-                                             ConfidenceIntervalMethodFromExtremes.ci_mle][1:],
-                        multiprocessing=True)
+    major_result()
+    # intermediate_result(altitudes=[1800], massif_names=None,
+    #                     uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.my_bayes,
+    #                                          ConfidenceIntervalMethodFromExtremes.ci_mle][1:],
+    #                     multiprocessing=True)
     # intermediate_result(altitudes=[900, 1200], massif_names=['Maurienne'],
     #                     uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.my_bayes,
     #                                          ConfidenceIntervalMethodFromExtremes.ci_mle][1:],
diff --git a/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_selection_curves.py b/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_selection_curves.py
index 454b0238..698222a9 100644
--- a/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_selection_curves.py
+++ b/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_selection_curves.py
@@ -31,12 +31,12 @@ def plot_selection_curves(altitude_to_visualizer: Dict[int, StudyVisualizerForNo
     selected_and_signifcative_list = get_ordered_list_from_counter(selected_and_significative_counter, total_of_selected_models, visualizer, permutation)
     labels = permute(['${}$'.format(t.label) for t in visualizer.non_stationary_trend_test], permutation)
 
-    # print(l)
-    # print(select_list)
-    # print(selected_and_signifcative_list)
-    # [(5, <class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters.GevLocationAgainstGumbel'> ), (6, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters.GevScaleAgainstGumbel' > ), (2, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gumbel_trend_test_one_parameter.GumbelScaleTrendTest' > ), (1, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gumbel_trend_test_one_parameter.GumbelLocationTrendTest' > ), (7, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_three_parameters.gev_trend_test_three_parameters.GevLocationAndScaleTrendTestAgainstGumbel' > ), (3, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gumbel_test_two_parameters.GumbelLocationAndScaleTrendTest' > ), (4, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gumbel_trend_test_one_parameter.GevStationaryVersusGumbel' > ), (0, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gumbel_trend_test_one_parameter.GumbelVersusGumbel' > )]
-    # [32.520325203252035, 25.609756097560975, 12.195121951219512, 9.34959349593496, 9.34959349593496, 4.471544715447155, 3.252032520325203, 3.252032520325203]
-    # [0, 13.821138211382113, 7.317073170731708, 8.536585365853659, 5.691056910569106, 1.6260162601626016, 1.2195121951219512, 2.4390243902439024]
+    print(l)
+    print(select_list)
+    print(selected_and_signifcative_list)
+    # [(5, <    class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters.GevLocationAgainstGumbel'> ), (6, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters.GevScaleAgainstGumbel' > ), (2, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gumbel_trend_test_one_parameter.GumbelScaleTrendTest' > ), (1, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gumbel_trend_test_one_parameter.GumbelLocationTrendTest' > ), (7, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_three_parameters.gev_trend_test_three_parameters.GevLocationAndScaleTrendTestAgainstGumbel' > ), (3, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gumbel_test_two_parameters.GumbelLocationAndScaleTrendTest' > ), (4, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gumbel_trend_test_one_parameter.GevStationaryVersusGumbel' > ), (0, < class 'experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gumbel_trend_test_one_parameter.GumbelVersusGumbel' > )]
+    # [32.64462809917355, 24.380165289256198, 12.396694214876034, 9.50413223140496, 9.090909090909092, 5.785123966942149, 3.71900826446281, 2.479338842975207]
+    # [0, 13.223140495867769, 7.851239669421488, 8.264462809917354, 4.958677685950414, 2.479338842975207, 0.8264462809917356, 2.0661157024793386]
 
     # parameters
     width = 5
diff --git a/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_trend_curves.py b/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_trend_curves.py
index 890084bf..2d47750f 100644
--- a/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_trend_curves.py
+++ b/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_trend_curves.py
@@ -17,7 +17,7 @@ def plot_trend_map(altitude_to_visualizer):
 
     for altitude, visualizer in altitude_to_visualizer.items():
         if 900 <= altitude <= 4200:
-            add_color = (visualizer.study.altitude - 1500) % 900 == 0
+            add_color = (visualizer.study.altitude - 1500) % 1200 == 0
             visualizer.plot_trends(max_abs_tdrl_above_900, add_colorbar=add_color)
             # Plot 2700 also with a colorbar
             if altitude == 2700:
@@ -52,7 +52,7 @@ def plot_trend_curves(altitude_to_visualizer: Dict[int, StudyVisualizerForNonSta
     ax.bar(altitudes, percent_decrease, width=width, color=color, edgecolor='blue', label='decreasing trend',
            linewidth=linewidth)
     ax.bar(altitudes, percent_decrease_signi, width=width, color=color, edgecolor='black',
-           label='significative decreasing trend',
+           label='significant decreasing trend',
            linewidth=linewidth)
     ax.legend(loc='upper left', prop={'size': size})
 
diff --git a/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_uncertainty_curves.py b/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_uncertainty_curves.py
index 83400351..c9e04aae 100644
--- a/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_uncertainty_curves.py
+++ b/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_uncertainty_curves.py
@@ -151,7 +151,7 @@ def add_title(ax, eurocode_region, massif_name, non_stationary_context):
 
 def plot_tdrl_bars(altitude_to_visualizer, ax, massif_name, valid_altitudes, legend_size, fontsize):
     visualizers = [v for a, v in altitude_to_visualizer.items()
-                   if a in valid_altitudes and massif_name in v.uncertainty_massif_names]
+                   if a in valid_altitudes and massif_name in v.massif_names_fitted]
     if len(visualizers) > 0:
         tdrl_values = [v.massif_name_to_tdrl_value[massif_name] for v in visualizers]
         # Plot bars
diff --git a/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_uncertainty_histogram.py b/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_uncertainty_histogram.py
index 76936a3d..3d9c660f 100644
--- a/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_uncertainty_histogram.py
+++ b/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_uncertainty_histogram.py
@@ -46,7 +46,6 @@ def plot_histogram(altitude_to_visualizer, model_subset_for_uncertainty):
             width = 200
         plot_histogram_ci_method(visualizers, model_subset_for_uncertainty, ci_method, ax, bincenters, width=width)
 
-
     ax.set_xticks(altitudes)
     ax.tick_params(labelsize=fontsize_label)
     if not (len(visualizer.uncertainty_methods) == 1
@@ -57,19 +56,36 @@ def plot_histogram(altitude_to_visualizer, model_subset_for_uncertainty):
     ax.set_ylabel('Massifs exceeding French standards (\%)', fontsize=fontsize_label)
     ax.set_xlabel('Altitude (m)', fontsize=fontsize_label)
     ax.set_ylim([0, 100])
+    ax.yaxis.grid()
+
+    ax_twiny = ax.twiny()
+    ax_twiny.plot(altitudes, [0 for _ in altitudes], linewidth=0)
+    ax_twiny.tick_params(labelsize=fontsize_label)
+    ax_twiny.set_xlim(ax.get_xlim())
+    ax_twiny.set_xticks(altitudes)
+    nb_massif_names = [v.study.nb_study_massif_names for v in altitude_to_visualizer.values()]
+    print(nb_massif_names)
+    ax_twiny.set_xticklabels(nb_massif_names)
+    ax_twiny.set_xlabel('Total number of massifs at each altitude (for the percentage)', fontsize=fontsize_label)
+
     ax.set_yticks([10 * i for i in range(11)])
-    visualizer.plot_name = 'Percentages of exceedance with {}'.format(get_display_name_from_object_type(model_subset_for_uncertainty))
+    visualizer.plot_name = 'Percentages of exceedance with {}'.format(
+        get_display_name_from_object_type(model_subset_for_uncertainty))
     # visualizer.show = True
     visualizer.show_or_save_to_file(no_title=True, dpi=dpi_paper1_figure)
     ax.clear()
+    ax_twiny.clear()
+    plt.close()
 
 
 def plot_histogram_ci_method(visualizers, model_subset_for_uncertainty, ci_method, ax, bincenters, width):
     three_percentages_of_excess = [v.excess_metrics(ci_method, model_subset_for_uncertainty)[:3] for v in
                                    visualizers]
     epsilon = 0.5
-    three_percentages_of_excess = [(a, b, c) if a == b else (max(epsilon, a), b, c) for (a, b, c) in three_percentages_of_excess]
-    three_percentages_of_excess = [(a, b, c) if b == c else (a, b, min(100 - epsilon, c)) for (a, b, c) in three_percentages_of_excess]
+    three_percentages_of_excess = [(a, b, c) if a == b else (max(epsilon, a), b, c) for (a, b, c) in
+                                   three_percentages_of_excess]
+    three_percentages_of_excess = [(a, b, c) if b == c else (a, b, min(100 - epsilon, c)) for (a, b, c) in
+                                   three_percentages_of_excess]
     y = [d[1] for d in three_percentages_of_excess]
     yerr = np.array([[d[1] - d[0], d[2] - d[1]] for d in three_percentages_of_excess]).transpose()
     label = ci_method_to_label[ci_method]
diff --git a/papers/exceeding_snow_loads/study_visualizer_for_non_stationary_trends.py b/papers/exceeding_snow_loads/study_visualizer_for_non_stationary_trends.py
index f33fe1ef..c2d1a3c2 100644
--- a/papers/exceeding_snow_loads/study_visualizer_for_non_stationary_trends.py
+++ b/papers/exceeding_snow_loads/study_visualizer_for_non_stationary_trends.py
@@ -117,6 +117,10 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
         else:
             return {m: EUROCODE_QUANTILE for m in self.massif_name_to_psnow.keys()}
 
+    @property
+    def massif_names_fitted(self):
+        return list(self.massif_name_to_years_and_maxima_for_model_fitting.keys())
+
     @cached_property
     def massif_name_to_years_and_maxima_for_model_fitting(self):
         if self.fit_gev_only_on_non_null_maxima:
@@ -162,6 +166,7 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
                 all_trend_test = [t for t in all_trend_test
                                   if acceptable_shape_parameter(t.unconstrained_estimator_gev_params.shape)]
             sorted_trend_test = sorted(all_trend_test, key=lambda t: t.aic)
+
             # Extract the stationary or non-stationary model that minimized AIC
             trend_test_that_minimized_aic = sorted_trend_test[0]
             massif_name_to_trend_test_that_minimized_aic[massif_name] = trend_test_that_minimized_aic
@@ -175,6 +180,7 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
                                                     [GumbelVersusGumbel, GumbelLocationTrendTest, GumbelScaleTrendTest,
                                                      GumbelLocationAndScaleTrendTest]][0]
             massif_name_to_gumbel_trend_test_that_minimized_aic[massif_name] = gumbel_trend_test_that_minimized_aic
+
         return massif_name_to_trend_test_that_minimized_aic, massif_name_to_stationary_trend_test_that_minimized_aic, massif_name_to_gumbel_trend_test_that_minimized_aic
 
     # Part 1 - Trends
@@ -342,9 +348,9 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
                 res = p.starmap(compute_eurocode_confidence_interval, arguments)
         else:
             res = [compute_eurocode_confidence_interval(*argument) for argument in arguments]
-        massif_name_to_eurocode_return_level_uncertainty = dict(zip(self.uncertainty_massif_names, res))
+        massif_name_to_eurocode_return_level_uncertainty = dict(zip(massifs_names, res))
         # For the rest of the massif names. Create a Eurocode Return Level Uncertainty as nan
-        for massif_name in set(self.study.all_massif_names) - set(self.uncertainty_massif_names):
+        for massif_name in set(self.study.all_massif_names) - set(massifs_names):
             massif_name_to_eurocode_return_level_uncertainty[massif_name] = self.default_eurocode_uncertainty
         return massif_name_to_eurocode_return_level_uncertainty
 
-- 
GitLab