From 86a1593b8b8898c17513d2982199818773b5db30 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Fri, 7 Feb 2020 18:10:03 +0100
Subject: [PATCH] [paper 1] add plot selection curves. refactor imports

---
 .../exceeding_snow_loads/paper_main_utils.py  |   5 +-
 .../main_result_trends_and_return_levels.py   |  18 ++--
 .../plot_selection_curves.py                  | 101 ++++++++++++++++++
 .../plot_uncertainty_histogram.py             |   4 +-
 ...dy_visualizer_for_non_stationary_trends.py |  14 ++-
 5 files changed, 127 insertions(+), 15 deletions(-)
 create mode 100644 papers/exceeding_snow_loads/result_trends_and_return_levels/plot_selection_curves.py

diff --git a/papers/exceeding_snow_loads/paper_main_utils.py b/papers/exceeding_snow_loads/paper_main_utils.py
index a4ff6384..4b5fc27d 100644
--- a/papers/exceeding_snow_loads/paper_main_utils.py
+++ b/papers/exceeding_snow_loads/paper_main_utils.py
@@ -1,10 +1,9 @@
 from collections import OrderedDict
-from enum import Enum
 
-from experiment.exceeding_snow_loads.study_visualizer_for_non_stationary_trends import \
-    StudyVisualizerForNonStationaryTrends
 from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \
     TemporalMarginFitMethod
+from papers.exceeding_snow_loads.study_visualizer_for_non_stationary_trends import \
+    StudyVisualizerForNonStationaryTrends
 
 
 def load_altitude_to_visualizer(altitudes, massif_names, model_subsets_for_uncertainty, study_class,
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 65d14343..043da14e 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
@@ -6,6 +6,9 @@ from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusSno
 from papers.exceeding_snow_loads.paper_main_utils import load_altitude_to_visualizer
 from papers.exceeding_snow_loads.paper_utils import paper_study_classes, paper_altitudes
 from papers.exceeding_snow_loads.result_trends_and_return_levels.plot_diagnosis_risk import plot_diagnosis_risk
+from papers.exceeding_snow_loads.result_trends_and_return_levels.plot_selection_curves import plot_selection_curves
+from papers.exceeding_snow_loads.result_trends_and_return_levels.plot_trend_curves import plot_trend_curves
+from papers.exceeding_snow_loads.result_trends_and_return_levels.plot_uncertainty_curves import plot_uncertainty_massifs
 from papers.exceeding_snow_loads.result_trends_and_return_levels.plot_uncertainty_histogram import \
     plot_uncertainty_histogram
 from papers.exceeding_snow_loads.study_visualizer_for_non_stationary_trends import \
@@ -63,10 +66,11 @@ def intermediate_result(altitudes, massif_names=None,
 
     # Plots
     # plot_trend_map(altitude_to_visualizer)
-    plot_diagnosis_risk(altitude_to_visualizer)
+    # plot_diagnosis_risk(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)
 
 
 def major_result():
@@ -86,11 +90,11 @@ def major_result():
 
 
 if __name__ == '__main__':
-    # major_result()
-    intermediate_result(altitudes=[1500, 1800], massif_names=None,
-                        uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.my_bayes,
-                                             ConfidenceIntervalMethodFromExtremes.ci_mle][1:],
-                        multiprocessing=True)
+    major_result()
+    # intermediate_result(altitudes=[1500, 1800][:1], 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
new file mode 100644
index 00000000..dfb96643
--- /dev/null
+++ b/papers/exceeding_snow_loads/result_trends_and_return_levels/plot_selection_curves.py
@@ -0,0 +1,101 @@
+from typing import Dict
+from collections import Counter
+import matplotlib.pyplot as plt
+
+from experiment.meteo_france_data.scm_models_data.abstract_extended_study import AbstractExtendedStudy
+from experiment.meteo_france_data.scm_models_data.visualization.utils import create_adjusted_axes
+from papers.exceeding_snow_loads.paper_utils import dpi_paper1_figure
+from papers.exceeding_snow_loads.study_visualizer_for_non_stationary_trends import StudyVisualizerForNonStationaryTrends
+from itertools import chain
+
+def plot_selection_curves(altitude_to_visualizer: Dict[int, StudyVisualizerForNonStationaryTrends]):
+    """
+    Plot a single trend curves
+    :return:
+    """
+    visualizer = list(altitude_to_visualizer.values())[0]
+
+    ax = create_adjusted_axes(1, 1)
+
+    selected_counter = merge_counter([v.selected_trend_test_class_counter for v in altitude_to_visualizer.values()])
+    selected_and_significative_counter = merge_counter([v.selected_and_significative_trend_test_class_counter for v in altitude_to_visualizer.values()])
+    total_of_selected_models = sum(selected_counter.values())
+    select_list = get_ordered_list_from_counter(selected_counter, total_of_selected_models, visualizer)
+    selected_and_signifcative_list = get_ordered_list_from_counter(selected_and_significative_counter, total_of_selected_models, visualizer)
+    print(select_list)
+    print(selected_and_signifcative_list)
+
+    # parameters
+    width = 5
+    size = 20
+    legend_fontsize = 20
+    color = 'white'
+    labelsize = 15
+    linewidth = 3
+    x = [10 * (i+1) for i in range(len(select_list))]
+    ax.bar(x, select_list, width=width, color=color, edgecolor='blue', label='selected model',
+           linewidth=linewidth)
+    ax.bar(x, selected_and_signifcative_list, width=width, color=color, edgecolor='black',
+           label='significative selected model',
+           linewidth=linewidth)
+    ax.legend(loc='upper left', prop={'size': size})
+    ax.set_ylabel('Selected model (\%)', fontsize=legend_fontsize)
+    ax.set_xlabel('Models', fontsize=legend_fontsize)
+
+    ax.set_xticks(x)
+    labels = ['${}$'.format(t.label) for t in visualizer.non_stationary_trend_test]
+    ax.set_xticklabels(labels)
+
+    # 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.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)]
+    # # upper_lim = max_percent + 3
+    # upper_lim = n + 5
+    # ax_lim = [0, upper_lim]
+    # for axis in [ax, ax_twinx]:
+    #     axis.set_ylim(ax_lim)
+    #     axis.set_yticks(ax_ticks)
+    #     axis.tick_params(labelsize=labelsize)
+    # ax.yaxis.grid()
+    #
+    # label_curve = (visualizer.label).replace('change', 'decrease')
+    # ax_twinx.set_ylabel(label_curve.replace('', ''), fontsize=legend_fontsize)
+    # for region_name, mean_decrease in zip(AbstractExtendedStudy.region_names, mean_decreases):
+    #     if len(mean_decreases) > 1:
+    #         label = region_name
+    #     else:
+    #         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})
+
+    # Save plot
+    plt.show()
+    visualizer.plot_name = 'Selection curves'
+    visualizer.show_or_save_to_file(no_title=True, dpi=dpi_paper1_figure)
+    plt.close()
+
+
+def get_ordered_list_from_counter(selected_counter, total_of_selected_models, visualizer):
+    return [100 * float(selected_counter[t]) / total_of_selected_models if t in selected_counter else 0
+                for t in visualizer.non_stationary_trend_test]
+
+def merge_counter(counters_list):
+    global_counter = counters_list[0]
+    for c in counters_list[1:]:
+        global_counter += c
+    return global_counter
+
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 a9a9f95c..76936a3d 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
@@ -3,8 +3,8 @@ import matplotlib.pyplot as plt
 import numpy as np
 
 from experiment.eurocode_data.utils import EUROCODE_RETURN_LEVEL_STR, EUROCODE_ALTITUDES
-from experiment.exceeding_snow_loads.paper_utils import dpi_paper1_figure, ModelSubsetForUncertainty
-from experiment.exceeding_snow_loads.study_visualizer_for_non_stationary_trends import \
+from papers.exceeding_snow_loads.paper_utils import dpi_paper1_figure, ModelSubsetForUncertainty
+from papers.exceeding_snow_loads.study_visualizer_for_non_stationary_trends import \
     StudyVisualizerForNonStationaryTrends
 from extreme_fit.model.result_from_model_fit.result_from_extremes.confidence_interval_method import ci_method_to_color, \
     ci_method_to_label, ConfidenceIntervalMethodFromExtremes
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 0ea784f8..cd7b1748 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
@@ -1,4 +1,4 @@
-from collections import OrderedDict
+from collections import OrderedDict, Counter
 from multiprocessing.pool import Pool
 from typing import Dict, List, Tuple
 
@@ -14,9 +14,9 @@ from experiment.meteo_france_data.scm_models_data.abstract_extended_study import
 from experiment.meteo_france_data.scm_models_data.abstract_study import AbstractStudy
 from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.study_visualizer import \
     StudyVisualizer
-from experiment.exceeding_snow_loads.check_mcmc_convergence_for_return_levels.gelman_convergence_test import \
+from papers.exceeding_snow_loads.check_mcmc_convergence_for_return_levels.gelman_convergence_test import \
     compute_gelman_convergence_value
-from experiment.exceeding_snow_loads.paper_utils import ModelSubsetForUncertainty
+from papers.exceeding_snow_loads.paper_utils import ModelSubsetForUncertainty
 from experiment.trend_analysis.abstract_score import MeanScore
 from experiment.trend_analysis.univariate_test.extreme_trend_test.abstract_gev_trend_test import AbstractGevTrendTest
 from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gumbel_trend_test_one_parameter import \
@@ -278,6 +278,14 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
         return {m: get_colors([v], self.cmap, -self._max_abs_change, self._max_abs_change)[0]
                 for m, v in self.massif_name_to_change_value.items()}
 
+    @cached_property
+    def selected_trend_test_class_counter(self):
+        return Counter([type(t) for t in self.massif_name_to_trend_test_that_minimized_aic.values()])
+
+    @cached_property
+    def selected_and_significative_trend_test_class_counter(self):
+        return Counter([type(t) for t in self.massif_name_to_trend_test_that_minimized_aic.values() if t.is_significant])
+
     @cached_property
     def massif_name_to_marker_style(self):
         d = {}
-- 
GitLab