diff --git a/papers/exceeding_snow_loads/paper_main_utils.py b/papers/exceeding_snow_loads/paper_main_utils.py index a4ff6384cdb127442d386b95de27efee538c5f20..4b5fc27d05c9b9a2736193c3f9e0e1d27f40e01f 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 65d143432c54e82a03423aafdbdfd8808f43c8fe..043da14ed538264a5eef132035deee569cd24551 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 0000000000000000000000000000000000000000..dfb96643aa2f46bf9c979b5c7b2b846e1f616695 --- /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 a9a9f95c2517214274f69e46814f33b45d9bcf95..76936a3dec980d7f740bb5941a559b9bfe60fe07 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 0ea784f83aef78e3e31a698ed2fda2918122a023..cd7b174888a0892da556ca242bbddd6bf6bcc05e 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 = {}