From f67f19b87c317e82f65adb0c4ea926263fff19be Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Mon, 8 Feb 2021 18:35:20 +0100 Subject: [PATCH] [projections] improve comparison on the quantile period --- .../main_comparison_on_quantile_period.py | 95 ++++++++++++------- 1 file changed, 59 insertions(+), 36 deletions(-) diff --git a/projects/projected_snowfall/comparison_with_scm/main_comparison_on_quantile_period.py b/projects/projected_snowfall/comparison_with_scm/main_comparison_on_quantile_period.py index d3259716..33af02fa 100644 --- a/projects/projected_snowfall/comparison_with_scm/main_comparison_on_quantile_period.py +++ b/projects/projected_snowfall/comparison_with_scm/main_comparison_on_quantile_period.py @@ -2,10 +2,12 @@ import numpy as np import matplotlib from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont_gcm_rcm_couples import \ + get_year_min_and_year_max_used_to_compute_quantile from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario, gcm_rcm_couple_to_color, \ - gcm_rcm_couple_to_str + gcm_rcm_couple_to_str, load_gcm_rcm_couples +from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day from extreme_data.meteo_france_data.scm_models_data.safran.safran_max_snowf import SafranSnowfall2020 -from extreme_data.meteo_france_data.adamont_data.get_list_gcm_rcm_couples_adamont_v2 import get_year_min_and_year_max_used_to_compute_quantile matplotlib.use('Agg') @@ -38,43 +40,64 @@ def compute_bias_and_display_it(ax, def main_comparaison_plot(): - altitudes = [600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600] - ax = plt.gca() - gcm_rcm_couples = [] + altitudes = [600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600][:] + for adamont_version in [1, 2]: + ax = plt.gca() + gcm_rcm_couples = load_gcm_rcm_couples(adamont_scenario=AdamontScenario.histo, adamont_version=adamont_version) - bias_in_the_mean = [] - for gcm_rcm_couple in gcm_rcm_couples: - gcm, rcm = gcm_rcm_couple - years_reanalysis, years_model = get_year_min_and_year_max_used_to_compute_quantile(rcm) - reanalysis_altitude_studies = AltitudesStudies(study_class=SafranSnowfall2020, - altitudes=altitudes, - year_min=years_reanalysis[0], - year_max=years_reanalysis[1]) - adamont_altitude_studies = AltitudesStudies(study_class=AdamontSnowfall, - altitudes=altitudes, - year_min=years_model[0], - year_max=years_model[1], - scenario=AdamontScenario.histo, - gcm_rcm_couple=gcm_rcm_couple) - bias_in_the_mean.extend(compute_bias_and_display_it(ax, reanalysis_altitude_studies, - adamont_altitude_studies, gcm_rcm_couple)) + study_class = SafranSnowfall2020 if adamont_version == 2 else SafranSnowfall1Day + comparaison_study_class = 'SAFRAN 2020' if adamont_version == 2 else 'SAFRAN 2019' - bias_in_the_mean = np.array(bias_in_the_mean) - min_bias, median_bias, max_bias = [f(bias_in_the_mean, axis=0) for f in [np.min, np.median, np.max]] + # Faster to load once the two cases + reanalysis_altitude_studies_1981 = AltitudesStudies(study_class=study_class, + altitudes=altitudes, + year_min=1981, + year_max=2011) + reanalysis_altitude_studies_1988 = AltitudesStudies(study_class=study_class, + altitudes=altitudes, + year_min=1988, + year_max=2011) + bias_in_the_mean = [] + for gcm_rcm_couple in gcm_rcm_couples: + print(gcm_rcm_couple) + gcm, rcm = gcm_rcm_couple + years_reanalysis, years_model = get_year_min_and_year_max_used_to_compute_quantile(gcm) + assert years_reanalysis[0] in [1981, 1988] + if years_reanalysis[0] == 1981: + reanalysis_altitude_studies = reanalysis_altitude_studies_1981 + else: + reanalysis_altitude_studies = reanalysis_altitude_studies_1988 + adamont_altitude_studies = AltitudesStudies(study_class=AdamontSnowfall, + altitudes=altitudes, + year_min=years_model[0], + year_max=years_model[1], + scenario=AdamontScenario.histo, + gcm_rcm_couple=gcm_rcm_couple, + adamont_version=adamont_version) + bias_in_the_mean.append(compute_bias_and_display_it(ax, reanalysis_altitude_studies, + adamont_altitude_studies, gcm_rcm_couple)) - # Plot the range for the bias, and the median - ax.yaxis.set_ticks(altitudes) - color = 'k' - ax.plot(median_bias, altitudes, label='Median bias', color=color) - 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') - study_str = STUDY_CLASS_TO_ABBREVIATION[type(reanalysis_altitude_studies.study)] - plot_name = 'Bias for {}\n' \ - '(on the period used for the quantile correction)'.format(study_str) - ax.set_ylim(top=altitudes[-1] + 500) - ax.legend() - reanalysis_altitude_studies.show_or_save_to_file(plot_name=plot_name) - plt.close() + bias_in_the_mean = np.array(bias_in_the_mean) + min_bias, median_bias, max_bias = [f(bias_in_the_mean, axis=0) for f in [np.min, np.median, np.max]] + + # Plot the range for the bias, and the median + ax.yaxis.set_ticks(altitudes) + color = 'k' + ax.plot(median_bias, altitudes, label='Median bias', color=color, linewidth=4) + # ax.fill_betweenx(altitudes, min_bias, max_bias, label='Range for the bias', alpha=0.2, color='whitesmoke') + ax.vlines(0, ymin=altitudes[0], ymax=altitudes[-1], color='k', linestyles='dashed') + study_str = STUDY_CLASS_TO_ABBREVIATION[type(reanalysis_altitude_studies.study)] + plot_name = 'Bias for annual maxima of {}'.format(study_str) + ax.set_ylim(top=altitudes[-1] + 1300) + study = adamont_altitude_studies.study + ax.legend(ncol=3, prop={'size': 7}) + ax.set_ylabel('Altitude (m)', fontsize=10) + ax.set_xlabel('Bias in the mean annual maxima of {} for ADAMONT v{} members\n' + ' against {} on the quantile mapping period ({})'.format(study_str, adamont_version, + comparaison_study_class, + study.variable_unit), fontsize=10) + reanalysis_altitude_studies.show_or_save_to_file(plot_name=plot_name, no_title=True) + plt.close() if __name__ == '__main__': -- GitLab