diff --git a/experiment/meteo_france_SCM_study/main_visualize.py b/experiment/meteo_france_SCM_study/main_visualize.py index e1a63c51a4dffb5c64f9fd4743713e8b3140f67a..f644c311bd647981eee918b9b9289adf13d15239 100644 --- a/experiment/meteo_france_SCM_study/main_visualize.py +++ b/experiment/meteo_france_SCM_study/main_visualize.py @@ -35,8 +35,9 @@ def study_iterator(study_class, only_first_one=False, both_altitude=False, verbo def extended_visualization(): for study_class in SCM_EXTENDED_STUDIES[:1]: for study in study_iterator(study_class, only_first_one=True): - study_visualizer = StudyVisualizer(study, only_first_row=True, save_to_file=False) - # study_visualizer.visualize_all_kde_graphs() + study_visualizer = StudyVisualizer(study, save_to_file=False, only_one_graph=True, vertical_kde_plot=True, + year_for_kde_plot=1958) + # study_visualizer.visualize_all_mean_and_max_graphs() study_visualizer.visualize_all_experimental_law() # for study_class in SCM_EXTENDED_STUDIES[:]: # for study in study_iterator(study_class, only_first_one=False): diff --git a/experiment/meteo_france_SCM_study/safran/safran_visualizer.py b/experiment/meteo_france_SCM_study/safran/safran_visualizer.py index 6d0af70fed45db5614066d46cf23bd0c3c4a7e81..9600169a1128a71773ded5fe0dd064fd0eff6929 100644 --- a/experiment/meteo_france_SCM_study/safran/safran_visualizer.py +++ b/experiment/meteo_france_SCM_study/safran/safran_visualizer.py @@ -28,17 +28,22 @@ from utils import get_display_name_from_object_type, VERSION_TIME, float_to_str_ class StudyVisualizer(object): - def __init__(self, study: AbstractStudy, show=True, save_to_file=False, only_one_graph=False, only_first_row=False): + def __init__(self, study: AbstractStudy, show=True, save_to_file=False, only_one_graph=False, only_first_row=False, + vertical_kde_plot=False, year_for_kde_plot=None): self.only_first_row = only_first_row self.only_one_graph = only_one_graph self.save_to_file = save_to_file self.study = study + self.plot_name = None + # KDE PLOT ARGUMENTS + self.vertical_kde_plot=vertical_kde_plot + self.year_for_kde_plot = year_for_kde_plot self.show = False if self.save_to_file else show self.window_size_for_smoothing = 21 if self.only_one_graph: self.figsize = (6.0, 4.0) elif self.only_first_row: - self.figsize = (16.0, 6.0) + self.figsize = (8.0, 6.0) else: self.figsize = (16.0, 10.0) @@ -77,17 +82,22 @@ class StudyVisualizer(object): def visualize_all_experimental_law(self): self.visualize_massif_graphs(self.visualize_experimental_law) - plot_name = ' Empirical distribution with all available data' - self.show_or_save_to_file(plot_name) + self.plot_name = ' Empirical distribution ' + self.plot_name += 'with all available data' if self.year_for_kde_plot is None else \ + 'for the year {}'.format(self.year_for_kde_plot) + self.show_or_save_to_file() def visualize_experimental_law(self, ax, massif_id): # Display the experimental law for a given massif - all_massif_data = np.concatenate([data[:, massif_id] for data in self.study.year_to_daily_time_serie.values()]) + if self.year_for_kde_plot is not None: + all_massif_data = self.study.year_to_daily_time_serie[self.year_for_kde_plot][:, massif_id] + else: + all_massif_data = np.concatenate([data[:, massif_id] for data in self.study.year_to_daily_time_serie.values()]) all_massif_data = np.sort(all_massif_data) # Kde plot, and retrieve the data forming the line color_kde = 'b' - sns.kdeplot(all_massif_data, bw=1, ax=ax, color=color_kde).set(xlim=0) + 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 @@ -100,25 +110,33 @@ class StudyVisualizer(object): x_level_to_color[x_level] = (color, name) for xi, (color, name) in x_level_to_color.items(): - yi = np.interp(xi, data_x, data_y) + if self.vertical_kde_plot: + yi = xi + xi = np.interp(yi, data_y, data_x) + else: + yi = np.interp(xi, data_x, data_y) ax.scatter([xi], [yi], color=color, marker="o", label=name) - ax.set_ylabel('Probability Density function f(x)', color=color_kde) + label_function = ax.set_xlabel if self.vertical_kde_plot else ax.set_ylabel + label_function('Probability Density function f(x)', color=color_kde) + xlabel = 'x = {}'.format(self.study.title) if self.only_one_graph else 'x' - ax.set_xlabel(xlabel) + label_function = ax.set_ylabel if self.vertical_kde_plot else ax.set_xlabel + label_function(xlabel) extraticks = [float(float_to_str_with_only_some_significant_digits(x, nb_digits=2)) for x in sorted(list(x_level_to_color.keys()))] if not self.only_one_graph: extraticks = [extraticks[0], extraticks[-1]] - ax.set_xticks(extraticks) + 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: ax.set_title(self.study.safran_massif_names[massif_id]) ax.legend() def visualize_all_mean_and_max_graphs(self): self.visualize_massif_graphs(self.visualize_mean_and_max_graph) - plot_name = ' mean with sliding window of size {}'.format(self.window_size_for_smoothing) - self.show_or_save_to_file(plot_name) + self.plot_name = ' mean with sliding window of size {}'.format(self.window_size_for_smoothing) + self.show_or_save_to_file() def visualize_mean_and_max_graph(self, ax, massif_id): # Display the graph of the max on top @@ -137,12 +155,12 @@ class StudyVisualizer(object): x, y = list(zip(*tuples_x_y)) x, y = average_smoothing_with_sliding_window(x, y, window_size_for_smoothing=self.window_size_for_smoothing) ax.plot(x, y, color=color_mean) - ax.set_ylabel('mean', color=color_mean) + ax.set_ylabel('mean with sliding window of size {}'.format(self.window_size_for_smoothing), color=color_mean) ax.set_xlabel('year') ax.set_title(self.study.safran_massif_names[massif_id]) def visualize_linear_margin_fit(self, only_first_max_stable=False): - plot_name = 'Full Likelihood with Linear marginals and max stable dependency structure' + self.plot_name = 'Full Likelihood with Linear marginals and max stable dependency structure' default_covariance_function = CovarianceFunction.cauchy max_stable_models = load_test_max_stable_models(default_covariance_function=default_covariance_function) if only_first_max_stable: @@ -162,7 +180,7 @@ class StudyVisualizer(object): if isinstance(max_stable_model, AbstractMaxStableModelWithCovarianceFunction): title += ' ' + str(default_covariance_function).split('.')[-1] self.fit_and_visualize_estimator(estimator, axes[i], title=title) - self.show_or_save_to_file(plot_name) + self.show_or_save_to_file() def fit_and_visualize_estimator(self, estimator, axes=None, title=None): estimator.fit() @@ -170,18 +188,20 @@ class StudyVisualizer(object): for ax in axes: self.study.visualize(ax, fill=False, show=False) - def show_or_save_to_file(self, plot_name): + def show_or_save_to_file(self): + assert self.plot_name is not None title = self.study.title - title += '\n' + plot_name - if not self.only_one_graph: + title += '\n' + self.plot_name + if self.only_one_graph: + plt.suptitle(self.plot_name) + else: plt.suptitle(title) if self.show: plt.show() if self.save_to_file: filename = "{}/{}".format(VERSION_TIME, '_'.join(self.study.title.split())) if not self.only_one_graph: - filename += "/{}".format('_'.join(plot_name.split())) - + filename += "/{}".format('_'.join(self.plot_name.split())) filepath = op.join(self.study.result_full_path, filename + '.png') dir = op.dirname(filepath) if not op.exists(dir): @@ -216,7 +236,7 @@ class StudyVisualizer(object): plt.show() def visualize_cmap(self, massif_name_to_value): - orig_cmap = plt.cm.coolwarm + orig_cmap = plt.cm. coolwarm # shifted_cmap = shiftedColorMap(orig_cmap, midpoint=0.75, name='shifted') massif_name_to_fill_kwargs = {massif_name: {'color': orig_cmap(value)} for massif_name, value in diff --git a/experiment/utils.py b/experiment/utils.py index 8b378946153da54fe801df190371dc99057e66c3..fe3083f5e50360cbd26f77e7a43b2a35a150aeb0 100644 --- a/experiment/utils.py +++ b/experiment/utils.py @@ -6,7 +6,8 @@ def average_smoothing_with_sliding_window(x, y, window_size_for_smoothing): kernel = np.ones(window_size_for_smoothing) / window_size_for_smoothing y = np.convolve(y, kernel, mode='valid') assert window_size_for_smoothing % 2 == 1 - nb_to_delete = int(window_size_for_smoothing // 2) - x = np.array(x)[nb_to_delete:-nb_to_delete] - assert len(x) == len(y) + if window_size_for_smoothing > 1: + nb_to_delete = int(window_size_for_smoothing // 2) + x = np.array(x)[nb_to_delete:-nb_to_delete] + assert len(x) == len(y), "{} vs {}".format(len(x), len(y)) return x, y