From 2657fd8e2231bfe5f21097781f40ea5402c49638 Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Mon, 6 Apr 2020 19:52:41 +0200 Subject: [PATCH] [contrasting project] improve daily snowfall fraction plot --- .../daily snowfall fraction.py | 86 +++++++++++++++---- 1 file changed, 69 insertions(+), 17 deletions(-) diff --git a/projects/contrasting_trends_in_snow_loads/snowfall fraction of total precipitation/daily snowfall fraction.py b/projects/contrasting_trends_in_snow_loads/snowfall fraction of total precipitation/daily snowfall fraction.py index fcee72d3..8403554b 100644 --- a/projects/contrasting_trends_in_snow_loads/snowfall fraction of total precipitation/daily snowfall fraction.py +++ b/projects/contrasting_trends_in_snow_loads/snowfall fraction of total precipitation/daily snowfall fraction.py @@ -5,11 +5,19 @@ from scipy.ndimage import gaussian_filter, gaussian_filter1d from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranRainfall1Day, SafranTemperature, \ SafranSnowfall1Day +Altitudes_groups = [[300, 600, 900], [1200, 1500, 1800], [2100, 2400, 2700], [3000, 3300, 3600]] -def plot_snowfall_fraction(ax, altitude, temperature_array, snowfall_array, rainfall_array): - if ax is None: - ax = plt.gca() - lim = 10 + +def compute_smoother_snowfall_fraction(altitudes, year_min, year_max): + all_time_series = np.concatenate([get_time_series(altitude, year_min, year_max) for altitude in altitudes], axis=1) + temperature_array, snowfall_array, rainfall_array = all_time_series + paper_setting = False + if paper_setting: + lim = 10 + sigma = 0.5 + else: + lim = 7.5 + sigma = 1 bins = np.linspace(-lim, lim, num=(4 * 2 * lim) + 1) inds = np.digitize(temperature_array, bins) snowfall_fractions = [] @@ -17,31 +25,75 @@ def plot_snowfall_fraction(ax, altitude, temperature_array, snowfall_array, rain mask = inds == j fraction = np.mean(snowfall_array[mask]) / np.mean(snowfall_array[mask] + rainfall_array[mask]) snowfall_fractions.append(fraction) - new_snowfall_fractions = 100 * gaussian_filter1d(snowfall_fractions, sigma=0.5) + new_snowfall_fractions = 100 * gaussian_filter1d(snowfall_fractions, sigma=sigma) x = bins[:-1] + 0.125 + return new_snowfall_fractions, sigma, x + - ax.plot(x, new_snowfall_fractions, label=altitude) +def daily_snowfall_fraction(ax, altitudes, year_min=1959, year_max=2019): + snowfall_fractions, sigma, x = compute_smoother_snowfall_fraction(altitudes, year_min, year_max) + # Plot results + label = '{}-{} at {}'.format(year_min, year_max, ' & '.join(['{} m'.format(a) for a in altitudes])) + ax.plot(x, snowfall_fractions, label=label, linewidth=4) ax.set_ylabel('Snowfall fraction (%)') - ax.set_xlabel('Daily surface air temperature (T)') + ax.set_xlabel('Daily surface air temperature (Celsius)') + ax.set_title('Snowfall fraction is smoothed with a gaussian filter with standard deviation={}'.format(sigma)) + ax.grid(b=True) ax.legend() -def daily_snowfall_fraction(ax, altitude, year_min=1959, year_max=2019): - temperature_study = SafranTemperature(altitude=altitude) - study_rainfall = SafranRainfall1Day(altitude=altitude) - study_snowfall = SafranSnowfall1Day(altitude=altitude) +def snowfall_fraction_difference_between_periods(ax, altitudes, year_min=1959, year_middle=1989, year_max=2019): + snowfall_fractions_past, sigma, x = compute_smoother_snowfall_fraction(altitudes, year_min, year_middle) + snowfall_fractions_recent, sigma, x = compute_smoother_snowfall_fraction(altitudes, year_middle + 1, year_max) + mask = snowfall_fractions_past == 0 + x = x[mask] + snowfall_ratio = snowfall_fractions_recent[mask] / snowfall_fractions_past[mask] + label = '{}'.format(' & '.join(['{} m'.format(a) for a in altitudes])) + ax.plot(x, snowfall_ratio, label=label, linewidth=4) + ax.set_ylabel('Ratio of Snowfall fraction {}-{} divided by Snowfall fraction {}-{}'.format(year_min, year_middle, + year_middle + 1, + year_max)) + ax.set_xlabel('Daily surface air temperature (Celsius)') + ax.set_title('Snowfall fraction is smoothed with a gaussian filter with standard deviation={}'.format(sigma)) + ax.grid(b=True) + ax.legend() + + +def get_time_series(altitude, year_min, year_max): + temperature_study = SafranTemperature(altitude=altitude, year_min=year_min, year_max=year_max) + study_rainfall = SafranRainfall1Day(altitude=altitude, year_min=year_min, year_max=year_max) + study_snowfall = SafranSnowfall1Day(altitude=altitude, year_min=year_min, year_max=year_max) all_time_series = [temperature_study.all_daily_series, study_snowfall.all_daily_series, study_rainfall.all_daily_series] - plot_snowfall_fraction(ax, *[np.concatenate(t) for t in all_time_series]) + all_time_series = [np.concatenate(t) for t in all_time_series] + all_time_series = np.array(all_time_series) + return all_time_series + + +def daily_snowfall_fraction_wrt_altitude(fast=True): + ax = plt.gca() + groups = [[1800]] if fast else Altitudes_groups + for altitudes in groups: + daily_snowfall_fraction(ax, altitudes) + plt.show() + + +def ratio_of_past_and_recent_daily_snowfall_fraction_wrt_altitude(): + ax = plt.gca() + for altitudes in Altitudes_groups: + snowfall_fraction_difference_between_periods(ax, altitudes) + plt.show() -def daily_snowfall_fraction_wrt_altitude(): +def daily_snowfall_fraction_wrt_time(): ax = plt.gca() - for altitude in [900, 1800, 2700]: - daily_snowfall_fraction(ax, altitude) + for altitudes in Altitudes_groups: + for year_min, year_max in [(1959, 1989), (1990, 2019)]: + daily_snowfall_fraction(ax, altitudes, year_min, year_max) plt.show() if __name__ == '__main__': - daily_snowfall_fraction_wrt_altitude() - # daily_snowfall_fraction(altitude=900) + # daily_snowfall_fraction_wrt_altitude(fast=True) + # daily_snowfall_fraction_wrt_time() + ratio_of_past_and_recent_daily_snowfall_fraction_wrt_altitude() -- GitLab