diff --git a/extreme_data/meteo_france_data/scm_models_data/safran/gap_between_study.py b/extreme_data/meteo_france_data/scm_models_data/safran/gap_between_study.py index a07f6be37c565a8256a0355f0d129b5b7526f54e..062ea2613bcfc405d4c2f53d4375bb23df78f799 100644 --- a/extreme_data/meteo_france_data/scm_models_data/safran/gap_between_study.py +++ b/extreme_data/meteo_france_data/scm_models_data/safran/gap_between_study.py @@ -3,7 +3,7 @@ from collections import OrderedDict from cached_property import cached_property from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day, \ - SafranSnowfallCenterOnDay1day + SafranSnowfallCenterOnDay1day, SafranSnowfallNotCenterOnDay1day, SafranSnowfallCenterOnDay1dayMeanRate from extreme_data.meteo_france_data.scm_models_data.safran.safran_max_snowf import SafranSnowfall2020, \ SafranSnowfall2019 @@ -40,6 +40,16 @@ class GapBetweenSafranSnowfall2019AndMySafranSnowfall2019Recentered(AbstractGapB def __init__(self, **kwargs): super().__init__(SafranSnowfall2019, SafranSnowfallCenterOnDay1day, **kwargs) +class GapBetweenSafranSnowfall2019AndMySafranSnowfall2019NotRecentered(AbstractGapBetweenTwoStudyClass): + + def __init__(self, **kwargs): + super().__init__(SafranSnowfall2019, SafranSnowfallNotCenterOnDay1day, **kwargs) + +class GapBetweenSafranSnowfall2019AndMySafranSnowfall2019RecenteredMeanRate(AbstractGapBetweenTwoStudyClass): + + def __init__(self, **kwargs): + super().__init__(SafranSnowfall2019, SafranSnowfallCenterOnDay1dayMeanRate, **kwargs) + class GapBetweenSafranSnowfall2019AndMySafranSnowfall2019(AbstractGapBetweenTwoStudyClass): diff --git a/extreme_data/meteo_france_data/scm_models_data/safran/safran.py b/extreme_data/meteo_france_data/scm_models_data/safran/safran.py index 29ff212488e30fedcfd547aeb29e7010aaa0cb8e..6a7846ecadc2627121a02737059e3a0ae3d6726a 100644 --- a/extreme_data/meteo_france_data/scm_models_data/safran/safran.py +++ b/extreme_data/meteo_france_data/scm_models_data/safran/safran.py @@ -10,12 +10,15 @@ from extreme_data.meteo_france_data.scm_models_data.safran.cumulated_study impor from extreme_data.meteo_france_data.scm_models_data.safran.safran_variable import SafranSnowfallVariable, \ SafranRainfallVariable, SafranTemperatureVariable, SafranTotalPrecipVariable, \ SafranNormalizedPrecipitationRateOnWetDaysVariable, SafranNormalizedPrecipitationRateVariable, \ - SafranDateFirstSnowfallVariable, SafranSnowfallVariableCenterOnDay + SafranDateFirstSnowfallVariable, SafranSnowfallVariableCenterOnDay, SafranSnowfallVariableNotCenterOnDay, \ + SafranSnowfallVariableCenterOnDayMeanRate class Safran(AbstractStudy): SAFRAN_VARIABLES = [SafranSnowfallVariable, + SafranSnowfallVariableCenterOnDayMeanRate, SafranSnowfallVariableCenterOnDay, + SafranSnowfallVariableNotCenterOnDay, SafranRainfallVariable, SafranTemperatureVariable, SafranTotalPrecipVariable, @@ -56,6 +59,28 @@ class SafranSnowfallCenterOnDay1day(SafranSnowfallCenterOnDay): super().__init__(nb_consecutive_days=1, **kwargs) +class SafranSnowfallNotCenterOnDay(Safran, CumulatedStudy): + + def __init__(self, **kwargs): + super().__init__(SafranSnowfallVariableNotCenterOnDay, **kwargs) + + +class SafranSnowfallNotCenterOnDay1day(SafranSnowfallNotCenterOnDay): + + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=1, **kwargs) + +class SafranSnowfallCenterOnDayMeanRate(Safran, CumulatedStudy): + + def __init__(self, **kwargs): + super().__init__(SafranSnowfallVariableCenterOnDayMeanRate, **kwargs) + + +class SafranSnowfallCenterOnDay1dayMeanRate(SafranSnowfallCenterOnDayMeanRate): + + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=1, **kwargs) + class SafranDateFirstSnowfall(Safran, CumulatedStudy): def __init__(self, **kwargs): diff --git a/extreme_data/meteo_france_data/scm_models_data/safran/safran_max_snowf.py b/extreme_data/meteo_france_data/scm_models_data/safran/safran_max_snowf.py index 724304dd1ec02ef8ea149f75a6d88a63eb93a331..43881f41e92c7f5607a4a5119fd2d9cc5a7a4b17 100644 --- a/extreme_data/meteo_france_data/scm_models_data/safran/safran_max_snowf.py +++ b/extreme_data/meteo_france_data/scm_models_data/safran/safran_max_snowf.py @@ -33,6 +33,10 @@ class AbstractSafranSnowfallMaxFiles(SafranSnowfall1Day): year_to_annual_maxima[year] = a return year_to_annual_maxima + @property + def variable_name(self): + return self.variable_class.NAME + str(self.safran_year) + ' ({})'.format(self.variable_unit) + class SafranSnowfall2020(AbstractSafranSnowfallMaxFiles): @@ -40,6 +44,8 @@ class SafranSnowfall2020(AbstractSafranSnowfallMaxFiles): super().__init__(2020, **kwargs) + + class SafranSnowfall2019(AbstractSafranSnowfallMaxFiles): def __init__(self, **kwargs): diff --git a/extreme_data/meteo_france_data/scm_models_data/safran/safran_variable.py b/extreme_data/meteo_france_data/scm_models_data/safran/safran_variable.py index 5c60111d2a02e550e43418f19ee84af67a5fe3e8..485560d4ec5a8f6922b32e5ed914bbc7e8009c38 100644 --- a/extreme_data/meteo_france_data/scm_models_data/safran/safran_variable.py +++ b/extreme_data/meteo_france_data/scm_models_data/safran/safran_variable.py @@ -63,6 +63,14 @@ class SafranSnowfallVariable(AbstractVariable): return snowfall_in_consecutive_days + + +class SafranSnowfallVariableNotCenterOnDay(SafranSnowfallVariable): + + def get_snowfall_rates(self, variable_array): + return variable_array[:-1] + + class SafranSnowfallVariableCenterOnDay(SafranSnowfallVariable): def daily_snowfall(self, hourly_snowfall, nb_days): @@ -77,6 +85,13 @@ class SafranSnowfallVariableCenterOnDay(SafranSnowfallVariable): return variable_array[:-1] +class SafranSnowfallVariableCenterOnDayMeanRate(SafranSnowfallVariableCenterOnDay): + + def get_snowfall_rates(self, variable_array): + return 0.5 * (variable_array[:-1] + variable_array[1:]) + + + class SafranDateFirstSnowfallVariable(SafranSnowfallVariable): NAME = 'Date First Snow' UNIT = 'days' diff --git a/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py b/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py index f0b11500166ea9caf9f1c3ee9d66cd0b5b760d46..9e346c0c97042fa70054c1a72607257a68adb5c2 100644 --- a/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py +++ b/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py @@ -11,7 +11,9 @@ from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusD from extreme_data.meteo_france_data.scm_models_data.crocus.crocus_snow_density import CrocusSnowDensity from extreme_data.meteo_france_data.scm_models_data.crocus.crocus_variables import CrocusDensityVariable from extreme_data.meteo_france_data.scm_models_data.safran.gap_between_study import GapBetweenSafranSnowfall2019And2020, \ - GapBetweenSafranSnowfall2019AndMySafranSnowfall2019Recentered, GapBetweenSafranSnowfall2019AndMySafranSnowfall2019 + GapBetweenSafranSnowfall2019AndMySafranSnowfall2019Recentered, GapBetweenSafranSnowfall2019AndMySafranSnowfall2019, \ + GapBetweenSafranSnowfall2019AndMySafranSnowfall2019NotRecentered, \ + GapBetweenSafranSnowfall2019AndMySafranSnowfall2019RecenteredMeanRate from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall, ExtendedSafranSnowfall, \ SafranRainfall, \ SafranTemperature, SafranPrecipitation, SafranSnowfall1Day, SafranSnowfall3Days, SafranSnowfall5Days, \ @@ -46,7 +48,9 @@ SCM_STUDY_CLASS_TO_ABBREVIATION = { SafranSnowfall2019: 'daily snowfall', GapBetweenSafranSnowfall2019And2020: 'daily snowfall\n bias = SAFRAN 2020 minus SAFRAN 2019', GapBetweenSafranSnowfall2019AndMySafranSnowfall2019Recentered: 'daily snowfall\n my SAFRAN 2019 recentered minus SAFRAN 2019', + GapBetweenSafranSnowfall2019AndMySafranSnowfall2019NotRecentered: 'daily snowfall\n my SAFRAN 2019 notrecentered minus SAFRAN 2019', GapBetweenSafranSnowfall2019AndMySafranSnowfall2019: 'daily snowfall\n my SAFRAN 2019 minus SAFRAN 2019', + GapBetweenSafranSnowfall2019AndMySafranSnowfall2019RecenteredMeanRate: 'daily snowfall\n my SAFRAN 2019 recentered mean rate minus SAFRAN 2019', SafranSnowfall3Days: 'SF3', SafranSnowfall5Days: 'SF5', SafranSnowfall7Days: 'SF7', diff --git a/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py b/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py index d4ce3b54b039e9237bb42a951f42ef03ebd2144e..efe1e5cfd4d11dfd208d37d03385ac7b8dd3947a 100644 --- a/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py @@ -196,4 +196,4 @@ class AltitudesStudies(object): moment = function(annual_maxima) mean_moment.append(moment) altitudes.append(altitude) - plot_against_altitude(altitudes, ax, massif_id, massif_name, mean_moment) + plot_against_altitude(altitudes, ax, massif_id, massif_name, mean_moment) \ No newline at end of file diff --git a/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py b/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py index c7654f38031807b33686912e06173f2b4d95fe1d..0f660a59e366c246cc22693bceb44ea41df96864 100644 --- a/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py @@ -3,15 +3,15 @@ import time from typing import List import matplotlib + matplotlib.use('Agg') -from extreme_data.meteo_france_data.scm_models_data.safran.safran_max_snowf import SafranSnowfall2019 +from extreme_data.meteo_france_data.scm_models_data.safran.safran_max_snowf import SafranSnowfall2019, \ + SafranSnowfall2020 from projects.altitude_spatial_model.altitudes_fit.plots.plot_histogram_altitude_studies import \ plot_shoe_plot_changes_against_altitude, plot_histogram_all_trends_against_altitudes, \ plot_shoe_plot_ratio_interval_size_against_altitude - - from extreme_fit.model.result_from_model_fit.result_from_extremes.abstract_extract_eurocode_return_level import \ AbstractExtractEurocodeReturnLevel @@ -34,39 +34,42 @@ from extreme_data.meteo_france_data.scm_models_data.utils import Season def main(): - study_classes = [SafranSnowfall2019, + study_classes = [SafranSnowfall2020, SafranSnowfall2019, SafranSnowfall1Day, SafranSnowfall3Days, - SafranSnowfall5Days, SafranSnowfall7Days][:1] + SafranSnowfall5Days, SafranSnowfall7Days][:3] seasons = [Season.annual, Season.winter, Season.spring, Season.automn][:1] set_seed_for_test() + model_must_pass_the_test = True - fast = False + fast = None if fast is None: - massif_names = ['Vanoise'] - altitudes_list = altitudes_for_groups[:] + massif_names = None + altitudes_list = altitudes_for_groups[2:3] elif fast: AbstractExtractEurocodeReturnLevel.NB_BOOTSTRAP = 10 - massif_names = ['Vanoise', 'Haute-Maurienne', 'Vercors'][2:] - altitudes_list = altitudes_for_groups[:1] + massif_names = ['Vanoise', 'Haute-Maurienne', 'Vercors'][:2] + altitudes_list = altitudes_for_groups[3:] else: massif_names = None altitudes_list = altitudes_for_groups[:] start = time.time() - main_loop(altitudes_list, massif_names, seasons, study_classes) + main_loop(altitudes_list, massif_names, seasons, study_classes, model_must_pass_the_test) end = time.time() duration = str(datetime.timedelta(seconds=end - start)) print('Total duration', duration) -def main_loop(altitudes_list, massif_names, seasons, study_classes): + +def main_loop(altitudes_list, massif_names, seasons, study_classes, model_must_pass_the_test): assert isinstance(altitudes_list, List) assert isinstance(altitudes_list[0], List) for season in seasons: for study_class in study_classes: print('Inner loop', season, study_class) - visualizer_list = load_visualizer_list(season, study_class, altitudes_list, massif_names - ) + visualizer_list = load_visualizer_list(season, study_class, altitudes_list, massif_names, + model_must_pass_the_test + ) plot_visualizers(massif_names, visualizer_list) for visualizer in visualizer_list: plot_visualizer(massif_names, visualizer) @@ -75,18 +78,18 @@ def main_loop(altitudes_list, massif_names, seasons, study_classes): def plot_visualizers(massif_names, visualizer_list): - plot_histogram_all_trends_against_altitudes(massif_names, visualizer_list) - plot_shoe_plot_ratio_interval_size_against_altitude(massif_names, visualizer_list) - for relative in [True, False]: - plot_shoe_plot_changes_against_altitude(massif_names, visualizer_list, relative=relative) - plot_coherence_curves(massif_names, visualizer_list) + # plot_histogram_all_trends_against_altitudes(massif_names, visualizer_list) + # plot_shoe_plot_ratio_interval_size_against_altitude(massif_names, visualizer_list) + # for relative in [True, False]: + # plot_shoe_plot_changes_against_altitude(massif_names, visualizer_list, relative=relative) + # plot_coherence_curves(massif_names, visualizer_list) # plot_coherence_curves(['Vanoise'], visualizer_list) pass def plot_visualizer(massif_names, visualizer): # Plot time series - visualizer.studies.plot_maxima_time_series(massif_names) + # visualizer.studies.plot_maxima_time_series(massif_names) # visualizer.studies.plot_maxima_time_series(['Vanoise']) # Plot the results for the model that minimizes the individual aic diff --git a/projects/altitude_spatial_model/altitudes_fit/main_gap_altitudes_studies.py b/projects/altitude_spatial_model/altitudes_fit/main_gap_altitudes_studies.py index 9801d985ac52f9489c3e9b9aac35df8e891515b1..1341d0ce4836785a72b2cc6ed856f12a5207cff6 100644 --- a/projects/altitude_spatial_model/altitudes_fit/main_gap_altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/main_gap_altitudes_studies.py @@ -5,7 +5,8 @@ from typing import List import matplotlib from extreme_data.meteo_france_data.scm_models_data.safran.gap_between_study import GapBetweenSafranSnowfall2019And2020, \ - GapBetweenSafranSnowfall2019AndMySafranSnowfall2019Recentered + GapBetweenSafranSnowfall2019AndMySafranSnowfall2019Recentered, \ + GapBetweenSafranSnowfall2019AndMySafranSnowfall2019NotRecentered from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import AltitudesStudies matplotlib.use('Agg') @@ -28,13 +29,14 @@ from extreme_data.meteo_france_data.scm_models_data.utils import Season def main(): study_classes = [GapBetweenSafranSnowfall2019AndMySafranSnowfall2019Recentered, + GapBetweenSafranSnowfall2019AndMySafranSnowfall2019NotRecentered, GapBetweenSafranSnowfall2019And2020, SafranSnowfall2020, SafranSnowfall1Day, SafranSnowfall3Days, - SafranSnowfall5Days, SafranSnowfall7Days][:1] + SafranSnowfall5Days, SafranSnowfall7Days][1:2] seasons = [Season.annual, Season.winter, Season.spring, Season.automn][:1] set_seed_for_test() - fast = False + fast = True if fast: altitudes_list = altitudes_for_groups[:1] else: diff --git a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitudes_studies_visualizer_for_non_stationary_models.py b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitudes_studies_visualizer_for_non_stationary_models.py index d6fa176c30260c5be47f1d75010e8aff13a6ac6f..1e4ec4f0022f8f99f66da7405b3fcee796dfb2fa 100644 --- a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitudes_studies_visualizer_for_non_stationary_models.py +++ b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitudes_studies_visualizer_for_non_stationary_models.py @@ -110,7 +110,7 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): or old_fold_fit.has_at_least_one_valid_model} def plot_moments(self): - for method_name in self.moment_names: + for method_name in self.moment_names[:2]: for order in self.orders: # self.plot_against_years(method_name, order) self.plot_map_moment(method_name, order) @@ -168,7 +168,7 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): moment = moment.replace('moment', '{}{}'.format(OneFoldFit.get_moment_str(order=order), str_for_last_year)) plot_name = '{}{} '.format(OneFoldFit.folder_for_plots, moment) - massif_name_to_text = self.massif_name_to_best_name + if 'change' in method_name: plot_name = plot_name.replace(str_for_last_year, '') plot_name += ' between {} and {}'.format(2019 - OneFoldFit.nb_years, 2019) @@ -185,6 +185,7 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): is_return_level_plot = (self.moment_names.index(method_name) == 0) and (order is None) if is_return_level_plot: + cmap = plt.cm.Spectral cmap = remove_the_extreme_colors(cmap, epsilon=0.25) cmap = get_inverse_colormap(cmap) @@ -217,6 +218,7 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): fontsize_label=fontsize_label, ) + @property def add_colorbar(self): # return isinstance(self.altitude_group, (VeyHighAltitudeGroup)) diff --git a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py index 95c0dec7c0a123ea02ed0bbd663685f0781eb498..75fcfd1b3fba77caba456cd07f7f7bc678973429 100644 --- a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py +++ b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py @@ -258,7 +258,6 @@ class OneFoldFit(object): @cached_property def is_significant(self) -> bool: if self.confidence_interval_based_on_delta_method: - print('old significance is used') stationary_model_classes = [StationaryAltitudinal, StationaryGumbelAltitudinal, AltitudinalShapeLinearTimeStationary] if any([isinstance(self.best_estimator.margin_model, c) @@ -268,7 +267,6 @@ class OneFoldFit(object): return self.likelihood_ratio > chi2.ppf(q=1 - self.SIGNIFICANCE_LEVEL, df=self.degree_freedom_chi2) else: # Bootstrap based significance - print('new significance is used') return self.cached_results_from_bootstrap[0] # @property diff --git a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/plot_total_aic.py b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/plot_total_aic.py index 45120d243d2ddd5646740e3e28604c384b823965..6ebcbd94da8c0a415c5261e94278a751abba583d 100644 --- a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/plot_total_aic.py +++ b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/plot_total_aic.py @@ -14,7 +14,7 @@ from projects.exceeding_snow_loads.utils import dpi_paper1_figure def plots(visualizer: AltitudesStudiesVisualizerForNonStationaryModels): - visualizer.plot_shape_map() + # visualizer.plot_shape_map() visualizer.plot_moments() # visualizer.plot_qqplots() # for std in [True, False]: diff --git a/projects/altitude_spatial_model/altitudes_fit/plots/plot_histogram_altitude_studies.py b/projects/altitude_spatial_model/altitudes_fit/plots/plot_histogram_altitude_studies.py index 27dd6855c7ed34ea781f921afcba3a39a9bb44aa..f9501c7bb912bda35390eeef4203402b272e6380 100644 --- a/projects/altitude_spatial_model/altitudes_fit/plots/plot_histogram_altitude_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/plots/plot_histogram_altitude_studies.py @@ -237,6 +237,10 @@ def plot_shoe_plot_changes_against_altitude(massif_names, visualizer_list: List[ lim_down, lim_up = ax.get_ylim() ax.set_ylim(lim_down, lim_up + upper_limit_for_legend) + # Plot a zero horizontal line + lim_left, lim_right = ax.get_xlim() + ax.hlines(0, xmin=lim_left, xmax=lim_right, linestyles='dashed') + # I could display the number of massif used to build each box plot. # plot_nb_massif_on_upper_axis(ax, labelsize, legend_fontsize, nb_massifs, x) diff --git a/projects/altitude_spatial_model/altitudes_fit/utils_altitude_studies_visualizer.py b/projects/altitude_spatial_model/altitudes_fit/utils_altitude_studies_visualizer.py index ccfdc0241abc642690714c592ea8c6f4fe0b538c..058d033cab5889845944acf6a4b40464c449dde3 100644 --- a/projects/altitude_spatial_model/altitudes_fit/utils_altitude_studies_visualizer.py +++ b/projects/altitude_spatial_model/altitudes_fit/utils_altitude_studies_visualizer.py @@ -5,7 +5,7 @@ from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.altitudes_s AltitudesStudiesVisualizerForNonStationaryModels -def load_visualizer_list(season, study_class, altitudes_list, massif_names, **kwargs_study): +def load_visualizer_list(season, study_class, altitudes_list, massif_names, model_must_pass_the_test=True, **kwargs_study): model_classes = ALTITUDINAL_GEV_MODELS_BASED_ON_POINTWISE_ANALYSIS visualizer_list = [] # Load all studies @@ -17,7 +17,7 @@ def load_visualizer_list(season, study_class, altitudes_list, massif_names, **kw show=False, temporal_covariate_for_fit=None, confidence_interval_based_on_delta_method=False, - display_only_model_that_pass_anderson_test=False + display_only_model_that_pass_anderson_test=model_must_pass_the_test ) visualizer_list.append(visualizer) compute_and_assign_max_abs(visualizer_list) diff --git a/projects/projected_snowfall/comparison_with_scm/main_comparison_histo.py b/projects/projected_snowfall/comparison_with_scm/main_comparison_reanalysis.py similarity index 69% rename from projects/projected_snowfall/comparison_with_scm/main_comparison_histo.py rename to projects/projected_snowfall/comparison_with_scm/main_comparison_reanalysis.py index 22515e119a39b955d79b4b028a1762862b103fb5..4237d79c80b3987e0f3cae2a468132e79f80a770 100644 --- a/projects/projected_snowfall/comparison_with_scm/main_comparison_histo.py +++ b/projects/projected_snowfall/comparison_with_scm/main_comparison_reanalysis.py @@ -1,10 +1,13 @@ import numpy as np import matplotlib + matplotlib.use('Agg') import matplotlib.pyplot as plt from extreme_data.meteo_france_data.scm_models_data.safran.gap_between_study import GapBetweenSafranSnowfall2019And2020, \ - GapBetweenSafranSnowfall2019AndMySafranSnowfall2019Recentered, GapBetweenSafranSnowfall2019AndMySafranSnowfall2019 + GapBetweenSafranSnowfall2019AndMySafranSnowfall2019Recentered, GapBetweenSafranSnowfall2019AndMySafranSnowfall2019, \ + GapBetweenSafranSnowfall2019AndMySafranSnowfall2019NotRecentered, \ + GapBetweenSafranSnowfall2019AndMySafranSnowfall2019RecenteredMeanRate from extreme_data.meteo_france_data.scm_models_data.visualization.main_study_visualizer import \ STUDY_CLASS_TO_ABBREVIATION from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import AltitudesStudies @@ -14,29 +17,31 @@ def comparison_plot(altitude_studies: AltitudesStudies, massif_name): ax = plt.gca() altitudes = [a for a, s in altitude_studies.altitude_to_study.items() if massif_name in s.study_massif_names] annual_maxima = [altitude_studies.altitude_to_study[a].massif_name_to_annual_maxima[massif_name] for a in altitudes] - min_bias, mean_bias, max_bias = [[f(maxima) for maxima in annual_maxima] for f in [np.min, np.mean, np.max]] + min_bias, median_bias, max_bias = [[f(maxima) for maxima in annual_maxima] for f in [np.min, np.median, np.max]] color = 'blue' - ax.plot(mean_bias, altitudes, label='Mean bias', color=color, marker='o') + ax.plot(median_bias, altitudes, label='Median bias', color=color, marker='o') ax.fill_betweenx(altitudes, min_bias, max_bias, label='Range for the bias', alpha=0.2, color=color) ax.vlines(0, ymin=altitudes[0], ymax=altitudes[-1], color='k') massif_name_str = massif_name.replace('_', '-') study_str = STUDY_CLASS_TO_ABBREVIATION[type(altitude_studies.study)] - plot_name = '{} - Bias between of {}'.format(massif_name_str, study_str) + plot_name = '{} - Bias for {}'.format(massif_name_str, study_str) plot_name += '\nWe consider maxima between {} and {}'.format(altitude_studies.study.year_min, - altitude_studies.study.year_max) + altitude_studies.study.year_max) ax.yaxis.set_ticks(altitudes) ax.set_ylim(top=altitudes[-1] + 500) - ax.legend() + ax.legend(loc='lower left') altitude_studies.show_or_save_to_file(plot_name=plot_name) plt.close() def main_comparaison_plot(): altitudes = [600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600] - for study_class in [GapBetweenSafranSnowfall2019AndMySafranSnowfall2019Recentered, + for study_class in [GapBetweenSafranSnowfall2019AndMySafranSnowfall2019RecenteredMeanRate, + GapBetweenSafranSnowfall2019AndMySafranSnowfall2019NotRecentered, + GapBetweenSafranSnowfall2019AndMySafranSnowfall2019Recentered, GapBetweenSafranSnowfall2019AndMySafranSnowfall2019, - GapBetweenSafranSnowfall2019And2020]: + GapBetweenSafranSnowfall2019And2020][-1:]: altitude_studies = AltitudesStudies(study_class=study_class, altitudes=altitudes) for massif_name in altitude_studies.study.all_massif_names():