Commit 86a1593b authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[paper 1] add plot selection curves. refactor imports

parent e1843e14
No related merge requests found
Showing with 127 additions and 15 deletions
+127 -15
from collections import OrderedDict 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 \ from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \
TemporalMarginFitMethod 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, def load_altitude_to_visualizer(altitudes, massif_names, model_subsets_for_uncertainty, study_class,
......
...@@ -6,6 +6,9 @@ from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusSno ...@@ -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_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.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_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 \ from papers.exceeding_snow_loads.result_trends_and_return_levels.plot_uncertainty_histogram import \
plot_uncertainty_histogram plot_uncertainty_histogram
from papers.exceeding_snow_loads.study_visualizer_for_non_stationary_trends import \ from papers.exceeding_snow_loads.study_visualizer_for_non_stationary_trends import \
...@@ -63,10 +66,11 @@ def intermediate_result(altitudes, massif_names=None, ...@@ -63,10 +66,11 @@ def intermediate_result(altitudes, massif_names=None,
# Plots # Plots
# plot_trend_map(altitude_to_visualizer) # 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_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_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(): def major_result():
...@@ -86,11 +90,11 @@ def major_result(): ...@@ -86,11 +90,11 @@ def major_result():
if __name__ == '__main__': if __name__ == '__main__':
# major_result() major_result()
intermediate_result(altitudes=[1500, 1800], massif_names=None, # intermediate_result(altitudes=[1500, 1800][:1], massif_names=None,
uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.my_bayes, # uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.my_bayes,
ConfidenceIntervalMethodFromExtremes.ci_mle][1:], # ConfidenceIntervalMethodFromExtremes.ci_mle][1:],
multiprocessing=True) # multiprocessing=True)
# intermediate_result(altitudes=[900, 1200], massif_names=['Maurienne'], # intermediate_result(altitudes=[900, 1200], massif_names=['Maurienne'],
# uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.my_bayes, # uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.my_bayes,
# ConfidenceIntervalMethodFromExtremes.ci_mle][1:], # ConfidenceIntervalMethodFromExtremes.ci_mle][1:],
......
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
...@@ -3,8 +3,8 @@ import matplotlib.pyplot as plt ...@@ -3,8 +3,8 @@ import matplotlib.pyplot as plt
import numpy as np import numpy as np
from experiment.eurocode_data.utils import EUROCODE_RETURN_LEVEL_STR, EUROCODE_ALTITUDES 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 papers.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.study_visualizer_for_non_stationary_trends import \
StudyVisualizerForNonStationaryTrends StudyVisualizerForNonStationaryTrends
from extreme_fit.model.result_from_model_fit.result_from_extremes.confidence_interval_method import ci_method_to_color, \ from extreme_fit.model.result_from_model_fit.result_from_extremes.confidence_interval_method import ci_method_to_color, \
ci_method_to_label, ConfidenceIntervalMethodFromExtremes ci_method_to_label, ConfidenceIntervalMethodFromExtremes
......
from collections import OrderedDict from collections import OrderedDict, Counter
from multiprocessing.pool import Pool from multiprocessing.pool import Pool
from typing import Dict, List, Tuple from typing import Dict, List, Tuple
...@@ -14,9 +14,9 @@ from experiment.meteo_france_data.scm_models_data.abstract_extended_study import ...@@ -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.abstract_study import AbstractStudy
from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.study_visualizer import \ from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.study_visualizer import \
StudyVisualizer 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 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.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.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 \ 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): ...@@ -278,6 +278,14 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
return {m: get_colors([v], self.cmap, -self._max_abs_change, self._max_abs_change)[0] 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()} 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 @cached_property
def massif_name_to_marker_style(self): def massif_name_to_marker_style(self):
d = {} d = {}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment