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