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 407fae9ec5daa6cefd79e6518c74614a14325385..258c03251ff26123fa2936339cd648644ac88c1d 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,6 +8,7 @@ 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_diagnosis_risk import plot_diagnosis_risk 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 \ @@ -68,10 +69,11 @@ def intermediate_result(altitudes, massif_names=None, _ = compute_minimized_aic(visualizer) # Plots - plot_trend_map(altitude_to_visualizer) + # plot_trend_map(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) def major_result(): @@ -92,7 +94,7 @@ def major_result(): if __name__ == '__main__': # major_result() - intermediate_result(altitudes=ALL_ALTITUDES_WITHOUT_NAN[:2], massif_names=None, + intermediate_result(altitudes=[1500, 1800], massif_names=None, uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.my_bayes, ConfidenceIntervalMethodFromExtremes.ci_mle][1:], multiprocessing=True) diff --git a/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_diagnosis_risk.py b/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_diagnosis_risk.py new file mode 100644 index 0000000000000000000000000000000000000000..a6112812dd2349afe9e567e1ab22ff92805b3f2e --- /dev/null +++ b/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_diagnosis_risk.py @@ -0,0 +1,36 @@ +import matplotlib.pyplot as plt + +from experiment.paper_past_snow_loads.paper_utils import ModelSubsetForUncertainty, dpi_paper1_figure +from extreme_fit.model.result_from_model_fit.result_from_extremes.confidence_interval_method import \ + ConfidenceIntervalMethodFromExtremes + + +def plot_diagnosis_risk(altitude_to_visualizer): + ax = plt.gca() + altitudes = list(altitude_to_visualizer.keys()) + visualizers = list(altitude_to_visualizer.values()) + visualizer = visualizers[0] + model_subset_for_uncertainty = ModelSubsetForUncertainty.non_stationary_gumbel_and_gev + ci_method = ConfidenceIntervalMethodFromExtremes.ci_mle + + plot_mean_exceedance(visualizers, altitudes, ax, model_subset_for_uncertainty, ci_method) + + visualizer.plot_name = 'Diagnosis plot' + visualizer.show_or_save_to_file(no_title=True, dpi=dpi_paper1_figure) + plt.close() + + plt.show() + + +def plot_mean_exceedance(visualizers, altitudes, ax, model_subset_for_uncertainty, ci_method): + l = [v.excess_metrics(ci_method, model_subset_for_uncertainty)[3:] for v in visualizers] + diff, diff_c, diff_e = zip(*l) + ax.plot(altitudes, diff, marker='o', color='red', label='diff') + ax.plot(altitudes, diff_c, marker='o', color='yellow', label='diff c') + ax.plot(altitudes, diff_e, marker='o', color='orange', label='diff e') + + ax.set_ylabel("Mean exceedance (kN)", fontsize=15) + ax.set_xlabel("Altitude", fontsize=15) + ax.yaxis.grid() + + ax.legend() diff --git a/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_uncertainty_histogram.py b/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_uncertainty_histogram.py index dd5ff29783a363a5767e66cfcc56859ffecd3a6f..680c7e888ec85e8b6b14c077be04b1c7b4f9ba8d 100644 --- a/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_uncertainty_histogram.py +++ b/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_uncertainty_histogram.py @@ -3,7 +3,7 @@ import matplotlib.pyplot as plt import numpy as np from experiment.eurocode_data.utils import EUROCODE_RETURN_LEVEL_STR, EUROCODE_ALTITUDES -from experiment.paper_past_snow_loads.paper_utils import dpi_paper1_figure +from experiment.paper_past_snow_loads.paper_utils import dpi_paper1_figure, ModelSubsetForUncertainty from experiment.paper_past_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, \ @@ -33,6 +33,10 @@ def plot_histogram(altitude_to_visualizer, model_subset_for_uncertainty): ax = plt.gca() altitudes = np.array(list(altitude_to_visualizer.keys())) bincenters = altitudes + + fontsize_label = 15 + legend_size = 15 + # Plot histogram for j, ci_method in enumerate(visualizer.uncertainty_methods): if len(visualizer.uncertainty_methods) == 2: offset = -50 if j == 0 else 50 @@ -41,13 +45,15 @@ def plot_histogram(altitude_to_visualizer, model_subset_for_uncertainty): else: width = 200 plot_histogram_ci_method(visualizers, model_subset_for_uncertainty, ci_method, ax, bincenters, width=width) - fontsize_label = 15 - legend_size = 15 + + ax.set_xticks(altitudes) ax.tick_params(labelsize=fontsize_label) if not (len(visualizer.uncertainty_methods) == 1 and visualizer.uncertainty_methods[0] == ConfidenceIntervalMethodFromExtremes.ci_mle): ax.legend(loc='upper left', prop={'size': legend_size}) + # ax.set_ylabel('Massifs whose 50-year return level\n' + # 'exceeds French standards (\%)', fontsize=fontsize_label) ax.set_ylabel('Massifs exceeding French standards (\%)', fontsize=fontsize_label) ax.set_xlabel('Altitude (m)', fontsize=fontsize_label) ax.set_ylim([0, 100]) @@ -59,7 +65,7 @@ def plot_histogram(altitude_to_visualizer, model_subset_for_uncertainty): def plot_histogram_ci_method(visualizers, model_subset_for_uncertainty, ci_method, ax, bincenters, width): - three_percentages_of_excess = [v.three_percentages_of_excess(ci_method, model_subset_for_uncertainty) for v in + 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] diff --git a/experiment/paper_past_snow_loads/study_visualizer_for_non_stationary_trends.py b/experiment/paper_past_snow_loads/study_visualizer_for_non_stationary_trends.py index 0116fe33f7ea201cae951c24a2ac70aa908d00d0..ab2a9c0ee0259a6213804c04e6b49ef5f862af45 100644 --- a/experiment/paper_past_snow_loads/study_visualizer_for_non_stationary_trends.py +++ b/experiment/paper_past_snow_loads/study_visualizer_for_non_stationary_trends.py @@ -6,6 +6,7 @@ import matplotlib.pyplot as plt import numpy as np from cached_property import cached_property +from experiment.eurocode_data.eurocode_region import C2, C1, E from experiment.eurocode_data.massif_name_to_departement import massif_name_to_eurocode_region from experiment.eurocode_data.utils import EUROCODE_QUANTILE, EUROCODE_RETURN_LEVEL_STR from experiment.meteo_france_data.plot.create_shifted_cmap import get_shifted_map, get_colors @@ -359,16 +360,31 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): return {m: r().valeur_caracteristique(altitude=self.study.altitude) for m, r in massif_name_to_eurocode_region.items() if m in self.uncertainty_massif_names} - def three_percentages_of_excess(self, ci_method, model_subset_for_uncertainty): - eurocode_and_uncertainties = [(self.massif_name_to_eurocode_values[massif_name], - self.triplet_to_eurocode_uncertainty[ - (ci_method, model_subset_for_uncertainty, massif_name)]) - for massif_name in self.uncertainty_massif_names] - a = np.array([(uncertainty.confidence_interval[0] > eurocode, - uncertainty.mean_estimate > eurocode, - uncertainty.confidence_interval[1] > eurocode) - for eurocode, uncertainty in eurocode_and_uncertainties]) - return 100 * np.mean(a, axis=0) + def excess_metrics(self, ci_method, model_subset_for_uncertainty): + triplet = [(massif_name_to_eurocode_region[massif_name], + self.massif_name_to_eurocode_values[massif_name], + self.triplet_to_eurocode_uncertainty[(ci_method, model_subset_for_uncertainty, massif_name)]) + for massif_name in self.uncertainty_massif_names] + # First array for histogram + a = 100 * np.array([(uncertainty.confidence_interval[0] > eurocode, + uncertainty.mean_estimate > eurocode, + uncertainty.confidence_interval[1] > eurocode) + for _, eurocode, uncertainty in triplet]) + a = np.mean(a, axis=0) + # Second array for curve + b = [[] for _ in range(3)] + for eurocode_region, eurocode, uncertainty in triplet: + diff = uncertainty.mean_estimate - eurocode + b[0].append(diff) + if eurocode_region in [C1, C2]: + b[1].append(diff) + if eurocode_region in [E]: + b[2].append(diff) + + b = [np.mean(np.array(e)) for e in b] + # Return the concatenated results + concatenated_result = list(a) + list(b) + return concatenated_result # Part 3 - QQPLOT