From 4b40540db4f73530f89d1863104263f9bf785227 Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Mon, 12 Oct 2020 19:07:45 +0200 Subject: [PATCH] [contrasting] improve plots. add comma to the name of the models. change altitude to elevation in several plots. --- .../gev_altitudinal_models.py | 17 ++++++++++------ .../altitudes_fit/main_altitudes_studies.py | 8 ++++---- .../one_fold_analysis/altitude_group.py | 13 ++++++++++-- ...es_visualizer_for_non_stationary_models.py | 2 ++ .../one_fold_analysis/one_fold_fit.py | 2 +- .../plots/plot_histogram_altitude_studies.py | 20 +++++++++---------- .../preliminary_analysis.py | 2 +- 7 files changed, 40 insertions(+), 24 deletions(-) diff --git a/extreme_fit/model/margin_model/polynomial_margin_model/gev_altitudinal_models.py b/extreme_fit/model/margin_model/polynomial_margin_model/gev_altitudinal_models.py index dadc236f..6007c798 100644 --- a/extreme_fit/model/margin_model/polynomial_margin_model/gev_altitudinal_models.py +++ b/extreme_fit/model/margin_model/polynomial_margin_model/gev_altitudinal_models.py @@ -34,23 +34,28 @@ class AbstractAltitudinalModel(AbstractSpatioTemporalPolynomialModel): @property def name_str(self): - s = '' + l = [] if self.dim_to_str_number(GevParams.SHAPE, self.coordinates.idx_x_coordinates) == '1': - s += '\\zeta_z' + l += ['\\zeta_z'] if self.dim_to_str_number(GevParams.LOC, self.coordinates.idx_temporal_coordinates) in ['1', '2']: - s += '\\mu_t' + s = '\\mu_t' if self.dim_to_str_number(GevParams.LOC, self.coordinates.idx_temporal_coordinates) == '2': s += '^2' + l += [s] if self.dim_to_str_number(GevParams.SCALE, self.coordinates.idx_temporal_coordinates) in ['1', '2']: - s += '\\sigma_t' + s = '\\sigma_t' if self.dim_to_str_number(GevParams.SCALE, self.coordinates.idx_temporal_coordinates) == '2': s += '^2' + l += [s] if self.dim_to_str_number(GevParams.SHAPE, self.coordinates.idx_temporal_coordinates) in ['1', '2']: - s += '\\zeta_t' + s = '\\zeta_t' if self.dim_to_str_number(GevParams.SHAPE, self.coordinates.idx_temporal_coordinates) == '2': s += '^2' - if len(s) == 0: + l += [s] + if len(l) == 0: s = '0' + else: + s = ','.join(l) return '$ \\boldsymbol{ \\mathcal{M}_{%s} }$' % s 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 64cb1a60..452965cc 100644 --- a/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py @@ -31,7 +31,7 @@ def main(): massif_names = None altitudes_list = altitudes_for_groups[:2] elif fast: - massif_names = ['Vanoise', 'Haute-Tarentaise', 'Vercors'] + massif_names = ['Vanoise', 'Haute-Maurienne', 'Vercors'] altitudes_list = altitudes_for_groups[:2] else: massif_names = None @@ -57,15 +57,15 @@ 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) - for relative in [True, False]: - plot_shoe_plot_changes_against_altitude(massif_names, visualizer_list, relative=relative) + # for relative in [True, False]: + # plot_shoe_plot_changes_against_altitude(massif_names, visualizer_list, relative=relative) # plot_coherence_curves(massif_names, visualizer_list) pass 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]: 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 fecd357a..196c9684 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 @@ -25,6 +25,11 @@ class AbstractAltitudeGroup(object): @property def xlabel(self): + return 'Elevation = {} m. Models are estimated with\n' \ + 'maxima from group {}, i.e. {}'.format(self.reference_altitude, self.group_id, self.formula) + + @property + def formula(self): # warning: the label could not correspond to all massifs, some might have been fitted with less data # idx = get_index_group_from_reference_altitude(reference_altitude) # min_altitude, *_, max_altitude = altitudes_for_groups[idx] @@ -36,8 +41,12 @@ class AbstractAltitudeGroup(object): else: min_altitude, max_altitude = 1000 * i, 1000 * (i + 1) formula = 'between {} m and {} m'.format(min_altitude, max_altitude) - return 'Altitude = {} m. Selected models were estimated with\n' \ - 'altitude group {}, i.e. with maxima {}'.format(self.reference_altitude, self.group_id, formula) + return formula + + @property + def formula_upper(self): + f = self.formula + return f[0].upper() + f[1:] class LowAltitudeGroup(AbstractAltitudeGroup): 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 8825fb09..3ff15e6f 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 @@ -429,6 +429,8 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): if one_fold.is_significant: non_stationary_significant_changes.append(change) + moment = 'relative mean' if relative else 'Mean' + print('{} for {}m'.format(moment, self.altitude_group.reference_altitude), np.mean(changes)) return changes, non_stationary_changes, non_stationary_significant_changes def get_valid_names(self, massif_names): diff --git a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py index 0f4a644a..b41207fc 100644 --- a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py +++ b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py @@ -313,7 +313,7 @@ class OneFoldFit(object): return standard_gumbel_quantiles def best_confidence_interval(self, altitude, year) -> EurocodeConfidenceIntervalFromExtremes: - EurocodeConfidenceIntervalFromExtremes.quantile_level = 1 - (1 / self.return_period) + EurocodeConfidenceIntervalFromExtremes.quantile_level = self.quantile_level return EurocodeConfidenceIntervalFromExtremes.from_estimator_extremes(estimator_extremes=self.best_estimator, ci_method=ConfidenceIntervalMethodFromExtremes.ci_mle, coordinate=np.array([altitude, year])) 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 8c04dd74..fcc2b133 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 @@ -100,11 +100,12 @@ 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('Altitudes', fontsize=legend_fontsize) + ax.set_xlabel('Elevation', fontsize=legend_fontsize) ax.tick_params(axis='both', which='major', labelsize=labelsize) ax.set_xticks(x) ax.yaxis.grid() - ax.set_xticklabels([str(v.altitude_group.reference_altitude) for v in visualizer_list]) + ax.set_ylim(bottom=0) + ax.set_xticklabels([v.altitude_group.formula_upper for v in visualizer_list]) plot_nb_massif_on_upper_axis(ax, labelsize, legend_fontsize, nb_massifs, x) @@ -135,23 +136,22 @@ def plot_shoe_plot_changes_against_altitude(massif_names, visualizer_list: List[ x = np.array([4 * width * (i + 1) for i in range(len(nb_massifs))]) - - for changes in all_changes: - print(changes) for j, (changes, label, color) in enumerate(list(zip(all_changes, labels, colors)), -1): - bplot = ax.boxplot(list(changes), positions=x + j * width, widths=width, patch_artist=True) + positions = x + j * width + bplot = ax.boxplot(list(changes), positions=positions, widths=width, patch_artist=True, showmeans=True) for patch in bplot['boxes']: patch.set_facecolor(color) custom_lines = [Line2D([0], [0], color=color, lw=4) for color in colors] - ax.legend(custom_lines, labels, loc='lower right') + loc = 'lower right' if relative else 'upper left' + ax.legend(custom_lines, labels, loc=loc) start = 'Relative changes' if relative else 'Changes' unit = '\%' if relative else visualizer.study.variable_unit - ax.set_ylabel('{} between 1969 and 2019 in {}-year return levels ({})'.format(start, OneFoldFit.return_period, + ax.set_ylabel('{} of {}-year return levels between 1969 and 2019 ({})'.format(start, OneFoldFit.return_period, unit), fontsize=legend_fontsize) - ax.set_xlabel('Altitudes', fontsize=legend_fontsize) + ax.set_xlabel('Elevation', fontsize=legend_fontsize) ax.tick_params(axis='both', which='major', labelsize=labelsize) ax.set_xticks(x) ax.yaxis.grid() @@ -179,4 +179,4 @@ def plot_nb_massif_on_upper_axis(ax, labelsize, legend_fontsize, nb_massifs, x): ax_twiny.tick_params(labelsize=labelsize) ax_twiny.set_xticklabels(nb_massifs) ax_twiny.set_xlim(ax.get_xlim()) - ax_twiny.set_xlabel('Total number of massifs at each altitude (for the percentage)', fontsize=legend_fontsize) + ax_twiny.set_xlabel('Total number of massifs at each elevation (for the percentage)', fontsize=legend_fontsize) diff --git a/projects/altitude_spatial_model/preliminary_analysis.py b/projects/altitude_spatial_model/preliminary_analysis.py index b2942820..d7de53e3 100644 --- a/projects/altitude_spatial_model/preliminary_analysis.py +++ b/projects/altitude_spatial_model/preliminary_analysis.py @@ -89,7 +89,7 @@ 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 = 'Altitude gradient for the {}'.format(ylabel[:-idx] + '/100m)') + label = 'Elevation gradient for the {}'.format(ylabel[:-idx] + '/100m)') gev_param_name_to_graduation = { GevParams.LOC: 0.5, GevParams.SCALE: 0.1, -- GitLab