From 6232585b3cb463a2e55cea3a314673d3761e37de Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Wed, 14 Oct 2020 16:06:24 +0200 Subject: [PATCH] [contrasting] improve plots. last version of the plot for the v1. improve the size of the label. improve also the process to get the legend for coherence plot --- .../visualization/plot_utils.py | 4 +- .../visualization/study_visualizer.py | 5 +- .../altitudes_fit/main_altitudes_studies.py | 11 ++-- .../one_fold_analysis/altitude_group.py | 4 +- ...es_visualizer_for_non_stationary_models.py | 3 + .../plots/plot_coherence_curves.py | 61 ++++++++++++------- .../plots/plot_histogram_altitude_studies.py | 6 +- .../preliminary_analysis.py | 3 +- 8 files changed, 59 insertions(+), 38 deletions(-) diff --git a/extreme_data/meteo_france_data/scm_models_data/visualization/plot_utils.py b/extreme_data/meteo_france_data/scm_models_data/visualization/plot_utils.py index 8d67f062..2a1bc186 100644 --- a/extreme_data/meteo_france_data/scm_models_data/visualization/plot_utils.py +++ b/extreme_data/meteo_france_data/scm_models_data/visualization/plot_utils.py @@ -36,7 +36,7 @@ def plot_against_altitude(x_ticks, ax, massif_id, massif_name, values, altitude= def load_plot(cmap, graduation, label, massif_name_to_value, altitude, fit_method, add_x_label=True, negative_and_positive_values=True, massif_name_to_text=None, add_colorbar=True, max_abs_change=None, - xlabel=None): + xlabel=None, fontsize_label=10): if max_abs_change is None: max_abs_change = max([abs(e) for e in massif_name_to_value.values()]) if negative_and_positive_values: @@ -75,7 +75,7 @@ def load_plot(cmap, graduation, label, massif_name_to_value, altitude, fit_metho vmax=max_ratio, ticks_values_and_labels=ticks_values_and_labels, label=label, - fontsize_label=10, + fontsize_label=fontsize_label, massif_name_to_text=massif_name_to_text, add_text=massif_name_to_text is not None, massif_name_to_hatch_boolean_list=massif_name_to_hatch_boolean_list diff --git a/extreme_data/meteo_france_data/scm_models_data/visualization/study_visualizer.py b/extreme_data/meteo_france_data/scm_models_data/visualization/study_visualizer.py index f8d3172c..e9c9b752 100644 --- a/extreme_data/meteo_france_data/scm_models_data/visualization/study_visualizer.py +++ b/extreme_data/meteo_france_data/scm_models_data/visualization/study_visualizer.py @@ -717,14 +717,15 @@ class StudyVisualizer(VisualizationParameters): def plot_map(self, cmap, fit_method, graduation, label, massif_name_to_value, plot_name, add_x_label=True, negative_and_positive_values=True, massif_name_to_text=None, altitude=None, add_colorbar=True, - max_abs_change=None, xlabel=None): + max_abs_change=None, xlabel=None, fontsize_label=10): if altitude is None: altitude = self.study.altitude if len(massif_name_to_value) > 0: load_plot(cmap, graduation, label, massif_name_to_value, altitude, fitmethod_to_str(fit_method), add_x_label=add_x_label, negative_and_positive_values=negative_and_positive_values, massif_name_to_text=massif_name_to_text, - add_colorbar=add_colorbar, max_abs_change=max_abs_change, xlabel=xlabel) + add_colorbar=add_colorbar, max_abs_change=max_abs_change, xlabel=xlabel, + fontsize_label=fontsize_label) self.plot_name = plot_name # self.show_or_save_to_file(add_classic_title=False, tight_layout=True, no_title=True, dpi=500) self.show_or_save_to_file(add_classic_title=False, no_title=True, dpi=500, tight_layout=True) 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 452965cc..5b66f6d2 100644 --- a/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py @@ -31,8 +31,8 @@ def main(): massif_names = None altitudes_list = altitudes_for_groups[:2] elif fast: - massif_names = ['Vanoise', 'Haute-Maurienne', 'Vercors'] - altitudes_list = altitudes_for_groups[:2] + massif_names = ['Vanoise', 'Haute-Maurienne', 'Vercors'][:1] + altitudes_list = altitudes_for_groups[2:] else: massif_names = None altitudes_list = altitudes_for_groups @@ -55,8 +55,7 @@ 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_histogram_all_models_against_altitudes(massif_names, visualizer_list) + plot_histogram_all_trends_against_altitudes(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) @@ -65,13 +64,13 @@ def plot_visualizers(massif_names, visualizer_list): def plot_visualizer(massif_names, visualizer): # Plot time series - visualizer.studies.plot_maxima_time_series(massif_names=massif_names) + # visualizer.studies.plot_maxima_time_series(massif_names=massif_names) # Plot moments against altitude # for std in [True, False][:]: # for change in [True, False, None]: # studies.plot_mean_maxima_against_altitude(massif_names=massif_names, std=std, change=change) # Plot the results for the model that minimizes the individual aic - # plot_individual_aic(visualizer) + plot_individual_aic(visualizer) # Plot the results for the model that minimizes the total aic # plot_total_aic(model_classes, visualizer) pass diff --git a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitude_group.py b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitude_group.py index 196c9684..dc5e1198 100644 --- a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitude_group.py +++ b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitude_group.py @@ -40,12 +40,14 @@ class AbstractAltitudeGroup(object): formula = 'above 3000 m' else: min_altitude, max_altitude = 1000 * i, 1000 * (i + 1) - formula = 'between {} m and {} m'.format(min_altitude, max_altitude) + formula = 'from {} m to {} m'.format(min_altitude, max_altitude) return formula @property def formula_upper(self): f = self.formula + f = f.replace('from ', '') + f = f.replace(' to ', '-') return f[0].upper() + f[1:] 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 3ff15e6f..82efd265 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 @@ -157,8 +157,10 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): max_abs_change = None massif_name_to_text = None graduation = self.altitude_group.graduation_for_return_level + fontsize_label = 17 else: graduation = 10 + fontsize_label = 10 negative_and_positive_values = self.moment_names.index(method_name) > 0 # Plot the map @@ -172,6 +174,7 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): max_abs_change=max_abs_change, massif_name_to_text=massif_name_to_text, xlabel=self.altitude_group.xlabel, + fontsize_label=fontsize_label, ) @property diff --git a/projects/altitude_spatial_model/altitudes_fit/plots/plot_coherence_curves.py b/projects/altitude_spatial_model/altitudes_fit/plots/plot_coherence_curves.py index 858edaeb..ad63c7f8 100644 --- a/projects/altitude_spatial_model/altitudes_fit/plots/plot_coherence_curves.py +++ b/projects/altitude_spatial_model/altitudes_fit/plots/plot_coherence_curves.py @@ -7,47 +7,61 @@ from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.altitudes_s from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.one_fold_fit import OneFoldFit -def plot_coherence_curves(massif_names, visualizer_list: List[ - AltitudesStudiesVisualizerForNonStationaryModels]): +def plot_coherence_curves(massif_names, visualizer_list: List[AltitudesStudiesVisualizerForNonStationaryModels]): folder = 'Coherence' visualizer = visualizer_list[0] names = visualizer.get_valid_names(massif_names) all_valid_names = set.union(*[v.get_valid_names(massif_names) for v in visualizer_list]) for massif_name in all_valid_names: - _, axes = plt.subplots(2, 2) - axes = axes.flatten() + + # For plotting the legend + legend = False + if legend: + ax = plt.gca() + axes = [ax for _ in range(4)] + else: + _, axes = plt.subplots(2, 2) + axes = axes.flatten() for i, ax in enumerate(axes): if i % 2 == 1: ax.set_yticks([]) axes = [ax if i % 2 == 0 else ax.twinx() for i, ax in enumerate(axes)] colors = ['blue', 'yellow', 'green'] - labels = ['Altitudinal-temporal model in 2019', 'Altitudinal-temporal model in 1969', 'Stationary model'] + labels = ['Elevational-temporal model in 2019', 'Elevational-temporal model in 1969', 'Stationary distribution'] altitudinal_model = [True, True, False] years = [2019, 1969, None] for color, global_label, boolean, year in list(zip(colors, labels, altitudinal_model, years))[::2]: - plot_coherence_curve(axes, massif_name, visualizer_list, boolean, color, global_label, year) + plot_coherence_curve(axes, massif_name, visualizer_list, boolean, color, global_label, year, legend) visualizer.plot_name = '{}/{}'.format(folder, massif_name.replace('_', '-')) visualizer.show_or_save_to_file(add_classic_title=False, no_title=True, dpi=200) plt.close() def plot_coherence_curve(axes, massif_name, visualizer_list: List[AltitudesStudiesVisualizerForNonStationaryModels], - is_altitudinal, color, global_label, year): + is_altitudinal, color, global_label, year, legend): x_all_list, values_all_list, labels, all_bound_list = load_all_list(massif_name, visualizer_list, is_altitudinal, year) + + legend_line = False for i, label in enumerate(labels): + if legend and i != 3: + continue ax = axes[i] # Plot with complete line for j, (x_list, value_list) in enumerate(list(zip(x_all_list, values_all_list))): value_list_i = value_list[i] label_plot = global_label if j == 0 else None if is_altitudinal: - ax.plot(x_list, value_list_i, linestyle='solid', color=color) - # ax.plot(x_list, value_list_i, linestyle='solid', color=color, label=label_plot) + if legend and legend_line: + ax.plot(x_list, value_list_i, linestyle='solid', color=color, label=label_plot) + else: + ax.plot(x_list, value_list_i, linestyle='solid', color=color) else: - # ax.plot(x_list, value_list_i, linestyle='None', color=color, label=label_plot, marker='o') - ax.plot(x_list, value_list_i, linestyle='None', color=color, marker='o') - ax.plot(x_list, value_list_i, linestyle='dotted', color=color) + if legend and legend_line: + ax.plot(x_list, value_list_i, linestyle='None', color=color, label=label_plot, marker='o') + else: + ax.plot(x_list, value_list_i, linestyle='None', color=color, marker='o') + ax.plot(x_list, value_list_i, linestyle='dotted', color=color) # Plot with dotted line for x_list_before, value_list_before, x_list_after, value_list_after in zip(x_all_list, values_all_list, @@ -62,18 +76,19 @@ def plot_coherence_curve(axes, massif_name, visualizer_list: List[AltitudesStudi for j, (x_list, bounds) in enumerate(list(zip(x_all_list, all_bound_list))): if len(bounds) > 0: lower_bound, upper_bound = bounds - # model_name = 'altitudinal-temporal' if is_altitudinal else 'stationary' - # fill_label = "95\% confidence interval for the {} model".format(model_name) if j == 0 else None - # ax.fill_between(x_list, lower_bound, upper_bound, color=color, alpha=0.2, label=fill_label) - ax.fill_between(x_list, lower_bound, upper_bound, color=color, alpha=0.2) - - # if is_altitudinal: - # min, max = ax.get_ylim() - # ax.set_ylim([min, 1.5 * max]) - # ax.legend(prop={'size': 5}) + if legend and not legend_line: + model_name = 'elevational-temporal model' if is_altitudinal else 'stationary distribution' + fill_label = "95\% confidence interval for the {}".format(model_name) if j == 0 else None + ax.fill_between(x_list, lower_bound, upper_bound, color=color, alpha=0.2, label=fill_label) + else: + ax.fill_between(x_list, lower_bound, upper_bound, color=color, alpha=0.2) + + if is_altitudinal: + min, max = ax.get_ylim() + ax.set_ylim([min, 2 * max]) + size = 17 if legend_line else 11 + ax.legend(prop={'size': size}) ax.set_ylabel(label) - # if i >= 2: - # ax.set_xlabel('Altitude') def load_all_list(massif_name, visualizer_list, altitudinal_model=True, year=2019): 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 fcc2b133..7967c27b 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 @@ -83,8 +83,8 @@ def plot_histogram_all_trends_against_altitudes(massif_names, visualizer_list: L plt.close() ax = plt.gca() width = 5 - size = 8 - legend_fontsize = 10 + size = 10 + legend_fontsize = 15 labelsize = 10 linewidth = 3 x = np.array([3 * width * (i + 1) for i in range(len(nb_massifs))]) @@ -100,7 +100,7 @@ def plot_histogram_all_trends_against_altitudes(massif_names, visualizer_list: L linewidth=linewidth) ax.legend(loc='upper left', prop={'size': size}) ax.set_ylabel('Percentage of massifs (\%) ', fontsize=legend_fontsize) - ax.set_xlabel('Elevation', fontsize=legend_fontsize) + ax.set_xlabel('Elevation group', fontsize=legend_fontsize) ax.tick_params(axis='both', which='major', labelsize=labelsize) ax.set_xticks(x) ax.yaxis.grid() diff --git a/projects/altitude_spatial_model/preliminary_analysis.py b/projects/altitude_spatial_model/preliminary_analysis.py index d7de53e3..f2256320 100644 --- a/projects/altitude_spatial_model/preliminary_analysis.py +++ b/projects/altitude_spatial_model/preliminary_analysis.py @@ -89,7 +89,8 @@ class PointwiseGevStudyVisualizer(AltitudesStudies): # Plot map of slope for each massif visualizer = StudyVisualizer(study=self.study, show=False, save_to_file=True) idx = 8 if param_name == GevParams.SHAPE else 1 - label = 'Elevation gradient for the {}'.format(ylabel[:-idx] + '/100m)') + the = ' the' if param_name in GevParams.PARAM_NAMES else '' + label = 'Elevation gradient for{} {}'.format(the, ylabel[:-idx] + '/100m)') gev_param_name_to_graduation = { GevParams.LOC: 0.5, GevParams.SCALE: 0.1, -- GitLab