From f1345ab385d62e222d477fa41ffa68062081420a Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Tue, 15 Sep 2020 09:59:54 +0200 Subject: [PATCH] [contrasting] add a pre-computed of the max_abs value for the shape parameter & for the various moments --- .../scm_models_data/abstract_study.py | 20 ++- .../visualization/plot_utils.py | 13 +- .../visualization/study_visualizer.py | 8 +- .../altitudes_fit/altitudes_studies.py | 2 +- .../altitudes_fit/main_altitudes_studies.py | 122 +++++++------ ...es_visualizer_for_non_stationary_models.py | 160 +++++++++--------- 6 files changed, 178 insertions(+), 147 deletions(-) diff --git a/extreme_data/meteo_france_data/scm_models_data/abstract_study.py b/extreme_data/meteo_france_data/scm_models_data/abstract_study.py index 44228b3f..998e53b4 100644 --- a/extreme_data/meteo_france_data/scm_models_data/abstract_study.py +++ b/extreme_data/meteo_france_data/scm_models_data/abstract_study.py @@ -17,6 +17,7 @@ import pandas as pd from PIL import Image from PIL import ImageDraw from matplotlib.colors import Normalize +from matplotlib.patches import Polygon from netCDF4 import Dataset from extreme_data.edf_data.weather_types import load_df_weather_types @@ -98,6 +99,7 @@ class AbstractStudy(object): """ Time """ + @cached_property def year_to_first_index_and_last_index(self): year_to_first_index_and_last_index = OrderedDict() @@ -546,15 +548,15 @@ class AbstractStudy(object): ax.fill(*coords_list, **{'color': default_color_for_missing_massif}) # For the moment we comment all the part of this code - # # Add a hatch to visualize the mean & variance variation sign - # hatch_list = ['//', '\\\\'] - # if massif_name_to_hatch_boolean_list is not None: - # if massif_name in massif_name_to_hatch_boolean_list: - # a = np.array(coords_list).transpose() - # hatch_boolean_list = massif_name_to_hatch_boolean_list[massif_name] - # for hatch, is_hatch in zip(hatch_list, hatch_boolean_list): - # if is_hatch: - # ax.add_patch(Polygon(xy=a, fill=False, hatch=hatch)) + # Add a hatch to visualize the mean & variance variation sign + hatch_list = ['//', '\\\\'] + if massif_name_to_hatch_boolean_list is not None: + if massif_name in massif_name_to_hatch_boolean_list: + a = np.array(coords_list).transpose() + hatch_boolean_list = massif_name_to_hatch_boolean_list[massif_name] + for hatch, is_hatch in zip(hatch_list, hatch_boolean_list): + if is_hatch: + ax.add_patch(Polygon(xy=a, fill=False, hatch=hatch)) if show_label: # Improve some explanation on the X axis and on the Y axis 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 f94aa78a..5bb951b5 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 @@ -35,8 +35,9 @@ 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): - max_abs_change = max([abs(e) for e in massif_name_to_value.values()]) + negative_and_positive_values=True, massif_name_to_text=None, add_colorbar=True, max_abs_change=None): + 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: ticks, labels = ticks_values_and_labels_for_percentages(graduation=graduation, max_abs_change=max_abs_change) min_ratio = -max_abs_change @@ -52,6 +53,11 @@ def load_plot(cmap, graduation, label, massif_name_to_value, altitude, fit_metho for m, v in massif_name_to_value.items()} ticks_values_and_labels = ticks, labels ax = plt.gca() + + massif_name_to_hatch_boolean_list = {} + for massif_name in set(AbstractStudy.all_massif_names()) - set(list(massif_name_to_value.keys())): + massif_name_to_hatch_boolean_list[massif_name] = [True, True] + AbstractStudy.visualize_study(ax=ax, massif_name_to_value=massif_name_to_value, massif_name_to_color=massif_name_to_color, @@ -59,7 +65,7 @@ def load_plot(cmap, graduation, label, massif_name_to_value, altitude, fit_metho axis_off=False, cmap=cmap, show_label=False, - add_colorbar=True, + add_colorbar=add_colorbar, show=False, vmin=min_ratio, vmax=max_ratio, @@ -68,6 +74,7 @@ def load_plot(cmap, graduation, label, massif_name_to_value, altitude, fit_metho fontsize_label=10, 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 ) ax.get_xaxis().set_visible(True) ax.set_xticks([]) 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 73881938..2ca68c25 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 @@ -716,13 +716,15 @@ class StudyVisualizer(VisualizationParameters): # PLot functions that should be common 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): + negative_and_positive_values=True, massif_name_to_text=None, altitude=None, add_colorbar=True, + max_abs_change=None): 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) + massif_name_to_text=massif_name_to_text, + add_colorbar=add_colorbar, max_abs_change=max_abs_change) 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) @@ -736,5 +738,5 @@ class StudyVisualizer(VisualizationParameters): plot_name2 = '{}/{}'.format(plot_name.split()[0], plot_name) for plot_name in [plot_name1, plot_name2]: self.plot_map(cmap, fit_method, graduation, label, massif_name_to_value, plot_name, add_x_label, negative_and_positive_values, - massif_name_to_text) + massif_name_to_text, ) diff --git a/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py b/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py index 4c4fffa4..fff0c988 100644 --- a/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py @@ -43,7 +43,7 @@ class AltitudesStudies(object): # Dataset Loader def spatio_temporal_dataset(self, massif_name, s_split_spatial: pd.Series = None, - s_split_temporal: pd.Series = None, top_n_values_to_remove=None): + s_split_temporal: pd.Series = None): coordinate_values_to_maxima = {} massif_altitudes = self.massif_name_to_altitudes[massif_name] if len(massif_altitudes) == 0: 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 9ea4741b..e783ea88 100644 --- a/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py @@ -1,3 +1,5 @@ +from typing import List + import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np @@ -28,37 +30,6 @@ from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.altitudes_s AltitudesStudiesVisualizerForNonStationaryModels -def plot_time_series(studies, massif_names=None): - studies.plot_maxima_time_series(massif_names=massif_names) - - -def plot_moments(studies, massif_names=None): - 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) - - -def plot_altitudinal_fit(studies, massif_names=None): - # model_classes = ALTITUDINAL_GEV_MODELS_LOCATION_ONLY_SCALE_ALTITUDES - # model_classes = ALTITUDINAL_GEV_MODELS_LOCATION_QUADRATIC_MINIMUM - model_classes = ALTITUDINAL_GEV_MODELS_BASED_ON_POINTWISE_ANALYSIS - # model_classes = ALTITUDINAL_GEV_MODELS_LOCATION - # model_classes = ALTITUDINAL_GEV_MODELS_LOCATION_CUBIC_MINIMUM - # model_classes = ALTITUDINAL_GEV_MODELS_QUADRATIC - visualizer = AltitudesStudiesVisualizerForNonStationaryModels(studies=studies, - model_classes=model_classes, - massif_names=massif_names, - show=False, - temporal_covariate_for_fit=None, - # temporal_covariate_for_fit=MeanAlpsTemperatureCovariate, - top_n_values_to_remove=None, - ) - # Plot the results for the model that minimizes the individual aic - plot_individual_aic(visualizer) - # Plot the results for the model that minimizes the total aic - # plot_total_aic(model_classes, visualizer) - - def main(): altitudes = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000][4:6] # todo: l ecart pour les saisons de l automne ou de sprint @@ -74,38 +45,87 @@ def main(): study_classes = [SafranPrecipitation1Day, SafranPrecipitation3Days, SafranPrecipitation5Days, SafranPrecipitation7Days][:] study_classes = [SafranSnowfall1Day, SafranSnowfall3Days, SafranPrecipitation1Day - , SafranPrecipitation3Days][:1] + , SafranPrecipitation3Days][:1] altitudes = [1800, 2100, 2400] study_classes = [SafranSnowfall1Day, SafranSnowfall3Days][:1] # Common parameters # altitudes = [600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600] massif_names = None + massif_names = ['Mercantour', 'Vercors', 'Ubaye'] seasons = [Season.annual, Season.winter, Season.spring, Season.automn][:1] - all_groups = altitudes_for_groups[:] - for altitudes in all_groups: - main_loop(altitudes, massif_names, seasons, study_classes) + main_loop(altitudes_for_groups, massif_names, seasons, study_classes) -def main_loop(altitudes, massif_names, seasons, study_classes): +def main_loop(altitudes_list, massif_names, seasons, study_classes): + assert isinstance(altitudes_list, List) + assert isinstance(altitudes_list[0], List) for season in seasons: for study_class in study_classes: - if issubclass(study_class, SimulationStudy): - for ensemble_idx in list(range(14))[:1]: - studies = AltitudesStudies(study_class, altitudes, season=season, - ensemble_idx=ensemble_idx) - plot_studies(massif_names, season, studies, study_class) - else: - studies = AltitudesStudies(study_class, altitudes, season=season) - plot_studies(massif_names, season, studies, study_class) - - -def plot_studies(massif_names, season, studies, study_class): - print('inner loop', season, study_class) - # plot_time_series(studies, massif_names) - # plot_moments(studies, massif_names) - plot_altitudinal_fit(studies, massif_names) + # if issubclass(study_class, SimulationStudy): + # for ensemble_idx in list(range(14))[:1]: + # studies = AltitudesStudies(study_class, altitudes, season=season, + # ensemble_idx=ensemble_idx) + # plot_studies(massif_names, season, studies, study_class) + # else: + visualizer_list = load_visualizer_list(season, study_class, altitudes_list, massif_names) + for visualizer in visualizer_list: + plots(massif_names, season, visualizer) + + +def load_visualizer_list(season, study_class, altitudes_list, massif_names): + model_classes = ALTITUDINAL_GEV_MODELS_BASED_ON_POINTWISE_ANALYSIS + visualizer_list = [] + # Load all studies + for altitudes in altitudes_list: + print('here', altitudes) + studies = AltitudesStudies(study_class, altitudes, season=season) + visualizer = AltitudesStudiesVisualizerForNonStationaryModels(studies=studies, + model_classes=model_classes, + massif_names=massif_names, + show=False, + temporal_covariate_for_fit=None, + # temporal_covariate_for_fit=MeanAlpsTemperatureCovariate, + ) + visualizer_list.append(visualizer) + # Compute the max abs for all metrics + d = {} + for method_name in AltitudesStudiesVisualizerForNonStationaryModels.moment_names: + for order in AltitudesStudiesVisualizerForNonStationaryModels.orders: + c = (method_name, order) + max_abs = max([ + max([abs(e) for e in v.method_name_and_order_to_d(method_name, order).values() + ]) for v in visualizer_list]) + d[c] = max_abs + # Assign the max abs dictionary + for v in visualizer_list: + v._method_name_and_order_to_max_abs = d + # Compute the max abs for the shape parameter + max_abs_for_shape = max([max([abs(e) for e in v.massif_name_to_shape.values()]) for v in visualizer_list]) + for v in visualizer_list: + v._max_abs_for_shape = max_abs_for_shape + + return visualizer_list + + +def plots(massif_names, season, visualizer): + studies = visualizer.studies + print('inner loop', season, type(studies.study)) + + # Plot time series + # studies.plot_maxima_time_series(massif_names=massif_names) + + # Plot moments + # 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 the results for the model that minimizes the total aic + # plot_total_aic(model_classes, visualizer) if __name__ == '__main__': 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 4240af2b..ee9f2868 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 @@ -21,7 +21,7 @@ from extreme_fit.model.margin_model.polynomial_margin_model.spatio_temporal_poly from extreme_fit.model.margin_model.utils import MarginFitMethod from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import AltitudesStudies from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.altitude_group import \ - get_altitude_group_from_altitudes + get_altitude_group_from_altitudes, HighAltitudeGroup from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.one_fold_fit import \ OneFoldFit from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates @@ -36,7 +36,7 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): fit_method=MarginFitMethod.extremes_fevd_mle, temporal_covariate_for_fit=None, display_only_model_that_pass_anderson_test=True, - top_n_values_to_remove=None): + ): super().__init__(studies.study, show=show, save_to_file=not show) self.studies = studies self.non_stationary_models = model_classes @@ -50,14 +50,19 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): self._massif_name_to_one_fold_fit = {} for massif_name in self.massif_names: if any([massif_name in study.study_massif_names for study in self.studies.altitude_to_study.values()]): - assert top_n_values_to_remove is None - dataset = studies.spatio_temporal_dataset(massif_name=massif_name, - top_n_values_to_remove=top_n_values_to_remove) + dataset = studies.spatio_temporal_dataset(massif_name=massif_name) old_fold_fit = OneFoldFit(massif_name, dataset, model_classes, self.fit_method, self.temporal_covariate_for_fit, type(self.altitude_group), self.display_only_model_that_pass_anderson_test) self._massif_name_to_one_fold_fit[massif_name] = old_fold_fit + # Cache + self._method_name_and_order_to_massif_name_to_value = {} + self._method_name_and_order_to_max_abs = {} + self._max_abs_for_shape = None + + moment_names = ['moment', 'changes_in_the_moment', 'relative_changes_in_the_moment'][2:] + orders = [1, 2, None][2:] @property def massif_name_to_one_fold_fit(self) -> Dict[str, OneFoldFit]: @@ -66,72 +71,60 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): or old_fold_fit.has_at_least_one_valid_non_stationary_model} def plot_moments(self): - for method_name in ['moment', 'changes_in_the_moment', 'relative_changes_in_the_moment']: - for order in [1, 2, None]: + for method_name in self.moment_names: + for order in self.orders: # self.plot_against_years(method_name, order) self.plot_map_moment(method_name, order) - def plot_map_moment(self, method_name, order): - # Compute values - massif_name_to_value = {} - for massif_name, one_fold_fit in self.massif_name_to_one_fold_fit.items(): - value = one_fold_fit.__getattribute__(method_name)([self.altitude_group.reference_altitude], order=order)[0] - massif_name_to_value[massif_name] = value + def method_name_and_order_to_max_abs(self, method_name, order): + c = (method_name, order) + if c not in self._method_name_and_order_to_max_abs: + return None + else: + return self._method_name_and_order_to_max_abs[c] + + def method_name_and_order_to_d(self, method_name, order): + c = (method_name, order) + if c not in self._method_name_and_order_to_massif_name_to_value: + # Compute values + massif_name_to_value = {} + for massif_name, one_fold_fit in self.massif_name_to_one_fold_fit.items(): + value = \ + one_fold_fit.__getattribute__(method_name)([self.altitude_group.reference_altitude], order=order)[0] + massif_name_to_value[massif_name] = value + # Remove values + if any([np.isinf(v) for v in massif_name_to_value.values()]): + print("shape to large > 0.5, thus removing std that are infinite") + massif_name_to_value = {m: v for m, v in massif_name_to_value.items() + if not np.isinf(v)} + # Store it + self._method_name_and_order_to_massif_name_to_value[c] = massif_name_to_value + return self._method_name_and_order_to_massif_name_to_value[c] - # Common plot settings + def plot_map_moment(self, method_name, order): + massif_name_to_value = self.method_name_and_order_to_d(method_name, order) + # Plot settings moment = ' '.join(method_name.split('_')) moment = moment.replace('moment', '{} in 2019'.format(OneFoldFit.get_moment_str(order=order))) plot_name = '{}{} annual maxima of {}'.format(OneFoldFit.folder_for_plots, moment, - SCM_STUDY_CLASS_TO_ABBREVIATION[ - self.studies.study_class]) + SCM_STUDY_CLASS_TO_ABBREVIATION[ + self.studies.study_class]) ylabel = '{} ({})'.format(plot_name, self.study.variable_unit) # Plot the map - if any([np.isinf(v) for v in massif_name_to_value.values()]): - print("shape to large > 0.5, thus removing std that are infinite") - massif_name_to_value = {m: v for m, v in massif_name_to_value.items() - if not np.isinf(v)} - - print(massif_name_to_value) - negative_and_positive_values = min(massif_name_to_value.values()) < 0 + a_change_is_displayed = self.moment_names.index(method_name) > 0 self.plot_map(cmap=plt.cm.coolwarm, fit_method=self.fit_method, graduation=10, label=ylabel, massif_name_to_value=massif_name_to_value, - plot_name=plot_name, add_x_label=True, negative_and_positive_values=negative_and_positive_values, - massif_name_to_text=None, altitude=self.altitude_group.reference_altitude) - - - - # ax.get_xaxis().set_visible(True) - # ax.set_xticks([]) - # ax.set_xlabel('Altitude = {}m'.format(self.altitude_group.reference_altitude), fontsize=15) - - - # cmap = get_shifted_map(min_ratio, max_ratio) - # print(massif_name_to_value) - # massif_name_to_color = {m: get_colors([v], cmap, -max_abs_change, max_abs_change)[0] - # for m, v in massif_name_to_value.items()} - # - # - # ticks_values_and_labels = ticks_values_and_labels_for_percentages(graduation, max_abs_change) - # - # ax = self.study.visualize_study(massif_name_to_value=massif_name_to_value, - # replace_blue_by_white=False, - # axis_off=False, show_label=False, - # add_colorbar=add_colorbar, - # # massif_name_to_marker_style=self.massif_name_to_marker_style, - # # marker_style_to_label_name=self.selected_marker_style_to_label_name, - # massif_name_to_color=massif_name_to_color, - # cmap=cmap, - # show=False, - # ticks_values_and_labels=ticks_values_and_labels, - # label=ylabel, - # add_legend=False, - # ) - - # self.plot_name = plot_name - # self.show_or_save_to_file(add_classic_title=False, tight_layout=True, no_title=True, - # dpi=500) - # ax.clear() + plot_name=plot_name, add_x_label=True, + negative_and_positive_values=a_change_is_displayed, + massif_name_to_text=None, altitude=self.altitude_group.reference_altitude, + add_colorbar=self.add_colorbar, + max_abs_change=self.method_name_and_order_to_max_abs(method_name, order) + ) + + @property + def add_colorbar(self): + return isinstance(self.altitude_group, HighAltitudeGroup) def plot_against_years(self, method_name, order): ax = plt.gca() @@ -149,19 +142,19 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): moment = ' '.join(method_name.split('_')) moment = moment.replace('moment', '{} in 2019'.format(OneFoldFit.get_moment_str(order=order))) plot_name = '{}Model {} annual maxima of {}'.format(OneFoldFit.folder_for_plots, moment, - SCM_STUDY_CLASS_TO_ABBREVIATION[self.studies.study_class]) + SCM_STUDY_CLASS_TO_ABBREVIATION[self.studies.study_class]) ax.set_ylabel('{} ({})'.format(plot_name, self.study.variable_unit), fontsize=15) ax.set_xlabel('altitudes', fontsize=15) ax.tick_params(axis='both', which='major', labelsize=13) self.studies.show_or_save_to_file(plot_name=plot_name, show=self.show, no_title=True) ax.clear() - def plot_abstract_fast(self, massif_name_to_value, label, graduation=10.0, cmap=plt.cm.coolwarm, add_x_label=True, - negative_and_positive_values=True, massif_name_to_text=None): - plot_name = '{}{}'.format(OneFoldFit.folder_for_plots, label) - self.plot_map(cmap, self.fit_method, graduation, label, massif_name_to_value, plot_name, add_x_label, - negative_and_positive_values, - massif_name_to_text) + # def plot_abstract_fast(self, massif_name_to_value, label, graduation=10.0, cmap=plt.cm.coolwarm, add_x_label=True, + # negative_and_positive_values=True, massif_name_to_text=None): + # plot_name = '{}{}'.format(OneFoldFit.folder_for_plots, label) + # self.plot_map(cmap, self.fit_method, graduation, label, massif_name_to_value, plot_name, add_x_label, + # negative_and_positive_values, + # massif_name_to_text) @property def massif_name_to_shape(self): @@ -203,24 +196,31 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): graduation = (max(values) - min(values)) / 6 print(coef_name, graduation, max(values), min(values)) negative_and_positive_values = (max(values) > 0) and (min(values) < 0) - self.plot_abstract_fast(massif_name_to_best_coef, + raise NotImplementedError + self.plot_map(massif_name_to_value=massif_name_to_best_coef, label='{}Coef/{} plot for {} {}'.format(OneFoldFit.folder_for_plots, - coef_name, - SCM_STUDY_CLASS_TO_ABBREVIATION[ - type(self.study)], - self.study.variable_unit), + coef_name, + SCM_STUDY_CLASS_TO_ABBREVIATION[ + type(self.study)], + self.study.variable_unit), add_x_label=False, graduation=graduation, massif_name_to_text=self.massif_name_to_name, negative_and_positive_values=negative_and_positive_values) def plot_shape_map(self): - self.plot_abstract_fast(self.massif_name_to_shape, - label='Shape parameter for {} maxima of {} in 2019 at {}m'.format( - self.study.season_name, - SCM_STUDY_CLASS_TO_ABBREVIATION[ - type(self.study)], - self.altitude_group.reference_altitude), - add_x_label=False, graduation=0.1, massif_name_to_text=self.massif_name_to_name, - cmap=matplotlib.cm.get_cmap('BrBG_r')) + + label = 'Shape parameter for {} maxima of {} in 2019'.format(self.study.season_name, + SCM_STUDY_CLASS_TO_ABBREVIATION[ + type(self.study)]) + self.plot_map(massif_name_to_value=self.massif_name_to_shape, + label=label, + plot_name=label, + add_x_label=True, graduation=0.1, massif_name_to_text=self.massif_name_to_name, + cmap=matplotlib.cm.get_cmap('BrBG_r'), + altitude=self.altitude_group.reference_altitude, + add_colorbar=self.add_colorbar, + max_abs_change=self._max_abs_for_shape, + fit_method=self.fit_method, + ) def plot_altitude_for_the_peak(self): pass @@ -264,7 +264,7 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): massif_name.replace('_', ' '), self.study.variable_unit)) peak_year_folder = 'Peak year ' + ylabel plot_name = '{}{}/Peak year for {}'.format(OneFoldFit.folder_for_plots, peak_year_folder, - massif_name.replace('_', '')) + massif_name.replace('_', '')) self.studies.show_or_save_to_file(plot_name=plot_name, show=self.show, no_title=True, tight_layout=True) plt.close() -- GitLab