diff --git a/experiment/meteo_france_SCM_study/main_visualize.py b/experiment/meteo_france_SCM_study/main_visualize.py index 8322c9e693b4512a4c278a90734ad68ce41967a7..3156b6285ab505f4c61067a653efc01903772256 100644 --- a/experiment/meteo_france_SCM_study/main_visualize.py +++ b/experiment/meteo_france_SCM_study/main_visualize.py @@ -33,9 +33,11 @@ def study_iterator(study_class, only_first_one=False, both_altitude=False, verbo def extended_visualization(): - for study_class in SCM_EXTENDED_STUDIES[:]: - for study in study_iterator(study_class, only_first_one=False): - study_visualizer = StudyVisualizer(study, save_to_file=True, only_one_graph=True, plot_block_maxima_quantiles=True) + save_to_file = False + only_first_one = True + for study_class in SCM_EXTENDED_STUDIES[:1]: + for study in study_iterator(study_class, only_first_one=only_first_one): + study_visualizer = StudyVisualizer(study, save_to_file=save_to_file, only_first_row=True) # study_visualizer.visualize_all_mean_and_max_graphs() study_visualizer.visualize_all_experimental_law() # for study_class in SCM_EXTENDED_STUDIES[:]: @@ -71,6 +73,6 @@ def complete_analysis(only_first_one=False): if __name__ == '__main__': - normal_visualization() - # extended_visualization() + # normal_visualization() + extended_visualization() # complete_analysis() diff --git a/experiment/meteo_france_SCM_study/safran/safran_visualizer.py b/experiment/meteo_france_SCM_study/safran/safran_visualizer.py index 430f96417830998a0021a642bf712a1a1d674653..ecb3515f46286efc3df69535245170326c1395fd 100644 --- a/experiment/meteo_france_SCM_study/safran/safran_visualizer.py +++ b/experiment/meteo_france_SCM_study/safran/safran_visualizer.py @@ -1,6 +1,7 @@ import math import os import os.path as op +from collections import OrderedDict import matplotlib.pyplot as plt import numpy as np @@ -100,29 +101,36 @@ class StudyVisualizer(object): [data[:, massif_id] for data in self.study.year_to_daily_time_serie.values()]) all_massif_data = np.sort(all_massif_data) + # Display an histogram on the background (with 100 bins, for visibility, and to check 0.9 quantiles) + ax2 = ax.twinx() + color_hist = 'k' + ax2.hist(all_massif_data, bins=50, density=True, histtype='step', color=color_hist) + ax2.set_ylabel('normalized histogram', color=color_hist) + # Kde plot, and retrieve the data forming the line color_kde = 'b' sns.kdeplot(all_massif_data, bw=1, ax=ax, color=color_kde, vertical=self.vertical_kde_plot).set(xlim=0) data_x, data_y = ax.lines[0].get_data() - # Plot the mean point in green - x_level_to_color = { - np.mean(all_massif_data): ('g', 'mean'), - } - # Plot some specific quantiles in their color + # Plot the mean and median points + name_to_xlevel_and_color = OrderedDict() + name_to_xlevel_and_color['median'] = (np.median(all_massif_data), 'chartreuse') + name_to_xlevel_and_color['mean'] = (np.mean(all_massif_data), 'g') + + # Plot some specific "extreme" quantiles with their color for p, color, name in zip(AbstractParams.QUANTILE_P_VALUES, AbstractParams.QUANTILE_COLORS, AbstractParams.QUANTILE_NAMES): x_level = all_massif_data[int(p * len(all_massif_data))] - x_level_to_color[x_level] = (color, name) + name_to_xlevel_and_color[name] = (x_level, color) # Plot some additional quantiles from the correspond Annual Maxima law if self.plot_block_maxima_quantiles: # This formula can only be applied if we have a daily time serie assert len(self.study.year_to_daily_time_serie[1958]) in [365, 366] p = p ** (1 / 365) x_level = all_massif_data[int(p * len(all_massif_data))] - x_level_to_color[x_level] = (color, BLOCK_MAXIMA_DISPLAY_NAME + name) + name_to_xlevel_and_color[BLOCK_MAXIMA_DISPLAY_NAME + name] = (x_level, color) - for xi, (color, name) in x_level_to_color.items(): + for name, (xi, color) in name_to_xlevel_and_color.items(): if self.vertical_kde_plot: yi = xi xi = np.interp(yi, data_y, data_x) @@ -137,10 +145,11 @@ class StudyVisualizer(object): xlabel = 'x = {}'.format(self.study.title) if self.only_one_graph else 'x' label_function = ax.set_ylabel if self.vertical_kde_plot else ax.set_xlabel label_function(xlabel) + sorted_x_levels = sorted(list([x_level for x_level, _ in name_to_xlevel_and_color.values()])) extraticks = [float(float_to_str_with_only_some_significant_digits(x, nb_digits=2)) - for x in sorted(list(x_level_to_color.keys()))] + for x in sorted_x_levels] if not self.only_one_graph: - extraticks = [extraticks[0], extraticks[-1]] + extraticks = [name_to_xlevel_and_color['mean'][0], name_to_xlevel_and_color[AbstractParams.QUANTILE_100][0]] set_ticks_function = ax.set_yticks if self.vertical_kde_plot else ax.set_xticks set_ticks_function(extraticks) if not self.only_one_graph: