diff --git a/experiment/meteo_france_data/scm_models_data/abstract_study.py b/experiment/meteo_france_data/scm_models_data/abstract_study.py index e856eaf51a16e4af88ac96c4773d637a42222e65..1b1795430033185a70b16450aea65ec529449b0e 100644 --- a/experiment/meteo_france_data/scm_models_data/abstract_study.py +++ b/experiment/meteo_france_data/scm_models_data/abstract_study.py @@ -229,14 +229,12 @@ class AbstractStudy(object): label=None, add_text=False, cmap=None, vmax=100, vmin=0, default_color_for_missing_massif='w', default_color_for_nan_values='w', + massif_name_to_color=None, ): if ax is None: ax = plt.gca() - if massif_name_to_value is None: - massif_name_to_fill_kwargs = None - massif_names, values = None, None - else: + if massif_name_to_color is None: massif_names, values = list(zip(*massif_name_to_value.items())) if cmap is None: colors = get_color_rbga_shifted(ax, replace_blue_by_white, values, label=label) @@ -245,8 +243,10 @@ class AbstractStudy(object): create_colorbase_axis(ax, label, cmap, norm) m = cm.ScalarMappable(norm=norm, cmap=cmap) colors = [m.to_rgba(value) if not np.isnan(value) else default_color_for_nan_values for value in values] - massif_name_to_fill_kwargs = {massif_name: {'color': color} for massif_name, color in - zip(massif_names, colors)} + massif_name_to_color = zip(massif_names, colors) + massif_name_to_fill_kwargs = {massif_name: {'color': color} for massif_name, color in + massif_name_to_color.items()} + massif_names = list(massif_name_to_fill_kwargs.keys()) for coordinate_id, coords_list in cls.idx_to_coords_list.items(): # Retrieve the list of coords (x,y) that define the contour of the massif of id coordinate_id @@ -275,6 +275,7 @@ class AbstractStudy(object): # ax.scatter(x, y) # ax.text(x, y, massif_name) # Display the center of the massif + print(massif_names) masssif_coordinate_for_display = cls.massifs_coordinates_for_display(massif_names) ax.scatter(masssif_coordinate_for_display.x_coordinates, @@ -295,6 +296,8 @@ class AbstractStudy(object): if show: plt.show() + return ax + """ CLASS ATTRIBUTES COMMON TO ALL OBJECTS (written as object attributes/methods for simplicity) diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py index 8c1c41ae44eea0aff6a9c99abd78a40f44264702..0923fbe59d0865c87ac4f0422b5db8e4993960bf 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py @@ -5,7 +5,7 @@ import matplotlib.pyplot as plt from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.abstract_hypercube_visualizer import \ AbstractHypercubeVisualizer from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ - SCM_STUDY_NAME_TO_COLOR + SCM_STUDY_NAME_TO_COLOR, SCM_STUDY_NAME_TO_ABBREVIATION, SCM_STUDY_CLASS_TO_ABBREVIATION from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.study_visualizer import \ StudyVisualizer from experiment.trend_analysis.univariate_test.abstract_univariate_test import AbstractUnivariateTest @@ -70,7 +70,8 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): **kwargs) if subtitle is None: - subtitle = self.study.variable_name[:5] + # subtitle = self.study.variable_name[:6] + subtitle = SCM_STUDY_CLASS_TO_ABBREVIATION[type(self.study)] # Ensure that subtitle does not belong to this dictionary so that the plot will be normal assert subtitle not in SCM_STUDY_NAME_TO_COLOR @@ -131,26 +132,33 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): axes_remaining = axes[end_idx:] ylabel_to_series = self.ylabel_to_series(reduction_function, isin_parameters) assert len(axes_remaining) == len(ylabel_to_series), '{}, {}'.format(len(axes_remaining), len(ylabel_to_series)) + best_year = np.nan for ax_idx, (ax, (ylabel, serie)) in enumerate(zip(axes_remaining, ylabel_to_series.items())): assert isinstance(serie, pd.Series) xlabel_values = list(serie.index) values = list(serie.values) + argmax_idx = np.argmax(values) + best_year = xlabel_values[argmax_idx] if plot_title is not None: - argmax_idx = np.argmax(values) - best_year = xlabel_values[argmax_idx] plot_title += ' (max reached in {})'.format(best_year) if subtitle in SCM_STUDY_NAME_TO_COLOR: - ax, color, ylabel = ax.twinx(), SCM_STUDY_NAME_TO_COLOR[subtitle], subtitle + ax_reversed, color = ax.twinx(), SCM_STUDY_NAME_TO_COLOR[subtitle] + ylabel = SCM_STUDY_NAME_TO_ABBREVIATION[subtitle] + ax.plot([], [], label=ylabel, color=color) + ax_reversed.plot(xlabel_values, values, label=ylabel, color=color) + ax_reversed.set_ylabel(ylabel, color=color) else: - color = 'k' ax.set_title(plot_title) - ax.plot(xlabel_values, values, label=subtitle, color=color) - ax.set_ylabel(ylabel, color=color) + ax.legend() + ax.set_xlabel(xlabel) + plt.setp(ax.get_yticklabels(), visible=False) - specific_title = 'Evolution of {} trends (significative or not) wrt to the {} with {}'.format(subtitle, xlabel, - self.trend_test_name) + specific_title = 'Evolution of {} trends wrt to the {} with {}'.format(subtitle, xlabel, + self.trend_test_name) specific_title += '\n ' + self.get_title_plot(xlabel) + if len(self.altitudes) == 1: + specific_title += ' altitude={}'.format(self.altitudes[0]) # Figure title # specific_title += '\n' @@ -166,7 +174,7 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): # specific_title += 'all trend {}, all significative trends: {} (+:{} -{})'.format(*percents) plt.suptitle(specific_title) - return specific_title + return specific_title, best_year def load_trend_test_evolution_axes(self, nb_rows): fig, axes = plt.subplots(nb_rows, 1, figsize=self.study_visualizer.figsize, constrained_layout=True) @@ -216,9 +224,44 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): return title - def load_axes_for_trend_test_repartition(self, nb_rows): - nb_trend_type = len(self.display_trend_type_to_style) - fig, axes = plt.subplots(nb_rows, nb_trend_type, figsize=self.study_visualizer.figsize) + def visualize_trend_test_repartition_poster(self, reduction_function, axes=None, subtitle='', isin_parameters=None, + plot_title=None): + ax = axes + i = 0 + trend_type_to_serie = {k: v[i].replace(0.0, np.nan) for k, v in + self.trend_type_to_series(reduction_function, isin_parameters).items()} + + massif_to_color = {} + poster_trend_types = [AbstractUnivariateTest.SIGNIFICATIVE_POSITIVE_TREND, + AbstractUnivariateTest.SIGNIFICATIVE_NEGATIVE_TREND, + AbstractUnivariateTest.NON_SIGNIFICATIVE_TREND][:2] + for display_trend_type, style in self.display_trend_type_to_style.items(): + if display_trend_type in poster_trend_types: + color = style[:1] + serie = trend_type_to_serie[display_trend_type] + massif_to_value = dict(serie) + print(massif_to_value) + massif_to_color.update({k: color for k, v in massif_to_value.items() if not np.isnan(v)}) + + self.study.visualize_study(ax, massif_name_to_color=massif_to_color, show=False) + if plot_title is not None: + ax.set_title(plot_title) + # row_title = self.get_title_plot(xlabel='massifs', ax_idx=i) + # StudyVisualizer.clean_axes_write_title_on_the_left(axes_row, row_title, left_border=None) + + # Global information + title = 'Repartition of {} trends'.format(subtitle) + title += ' at altitude={} for the starting_year={}'.format(self.altitudes[0], self.starting_years[0]) + plt.suptitle(title) + + return title + + def load_axes_for_trend_test_repartition(self, nb_rows, nb_columns=None): + if nb_columns is None: + nb_columns = len(self.display_trend_type_to_style) + fig, axes = plt.subplots(nb_rows, nb_columns, figsize=self.study_visualizer.figsize) + if isinstance(axes, np.ndarray): + axes = axes.reshape((nb_rows, nb_columns)) return axes @property @@ -242,20 +285,23 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): else: assert len(axes) == self.nb_rows - last_result = '' + results = [] for subtitle, reduction_function in self.subtitle_to_reduction_function(self.year_reduction, add_detailed_plot=add_detailed_plots).items(): - last_result = self.visualize_trend_test_evolution(reduction_function=reduction_function, - xlabel=STARTING_YEARS_XLABEL, - xlabel_values=self.starting_years, axes=axes, - marker=marker, - subtitle=subtitle, - isin_parameters=isin_parameters, - plot_title=plot_title - ) + specific_title, best_year = self.visualize_trend_test_evolution( + reduction_function=reduction_function, + xlabel=STARTING_YEARS_XLABEL, + xlabel_values=self.starting_years, axes=axes, + marker=marker, + subtitle=subtitle, + isin_parameters=isin_parameters, + plot_title=plot_title + ) + results.append((specific_title, best_year, subtitle)) if show_or_save_to_file: - self.show_or_save_to_file(specific_title=last_result) - return last_result + last_specific_title = results[-1][0] + self.show_or_save_to_file(specific_title=last_specific_title) + return results @staticmethod def index_reduction(df, level): @@ -288,7 +334,6 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): def visualize_massif_trend_test(self, axes=None, add_detailed_plots=False, plot_title=None, isin_parameters=None, show_or_save_to_file=True): - if axes is None: axes = self.load_axes_for_trend_test_repartition(self.nb_rows) else: @@ -305,3 +350,18 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): self.show_or_save_to_file(specific_title=last_title) return last_title + + def visualize_massif_trend_test_one_altitude(self, axes=None, add_detailed_plots=False, plot_title=None, + isin_parameters=None, + show_or_save_to_file=True): + last_title = '' + for subtitle, reduction_function in self.subtitle_to_reduction_function(self.index_reduction, + level=self.massif_index_level, + add_detailed_plot=add_detailed_plots).items(): + last_title = self.visualize_trend_test_repartition_poster(reduction_function, axes, subtitle=subtitle, + isin_parameters=isin_parameters, + plot_title=plot_title) + if show_or_save_to_file: + self.show_or_save_to_file(specific_title=last_title) + + return last_title diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/__init__.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_one_altitudes.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_one_altitudes.py new file mode 100644 index 0000000000000000000000000000000000000000..f44ea7296c9c0a5b63e065c984f0cbddd31af620 --- /dev/null +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_one_altitudes.py @@ -0,0 +1,70 @@ +import time + +from experiment.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall +from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_hypercube_visualizer import \ + AltitudeHypercubeVisualizer +from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_hypercube_visualizer_extended import \ + AltitudeHypercubeVisualizerBisExtended, QuantityHypercubeWithoutTrendExtended, \ + AltitudeHypercubeVisualizerWithoutTrendExtended, QuantityHypercubeWithoutTrend +from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.quantity_altitude_visualizer import \ + QuantityAltitudeHypercubeVisualizer +from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.utils_hypercube import \ + load_altitude_visualizer, load_quantity_visualizer +from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ + ALL_ALTITUDES, SCM_STUDIES +from experiment.trend_analysis.univariate_test.abstract_gev_change_point_test import GevLocationChangePointTest + + +def get_fast_parameters(altitude=1800): + save_to_file = False + only_first_one = False + nb_data_reduced_for_speed = 4 + altitudes = [altitude] + last_starting_year = None + trend_test_class = GevLocationChangePointTest + return altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class + + +def get_fast_altitude_visualizer(altitude_hypercube_class, altitude=1800, study_class=SafranSnowfall, exact_year=None): + altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class = get_fast_parameters(altitude=altitude) + visualizer = load_altitude_visualizer(altitude_hypercube_class, altitudes, last_starting_year, + nb_data_reduced_for_speed, only_first_one, save_to_file, [study_class], + trend_test_class, exact_starting_year=exact_year) + return visualizer + + +def get_fast_quantity_visualizer(quantity_hypercube_class, altitude=1800, study_classes=None): + altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class = get_fast_parameters(altitude=altitude) + if study_classes is None: + study_classes = SCM_STUDIES[:2] + visualizer = load_quantity_visualizer(quantity_hypercube_class, altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, + save_to_file, study_classes, trend_test_class) + return visualizer + + +def main_mean_log_likelihood_poster_1(): + # Simply the main graph + res = get_fast_quantity_visualizer(QuantityHypercubeWithoutTrend).visualize_year_trend_test(add_detailed_plots=True) + # get_fast_quantity_visualizer(QuantityHypercubeWithoutTrendExtended).vsualize_year_trend_by_regions_and_altitudes( + # add_detailed_plot=True) + # get_fast_altitude_visualizer(AltitudeHypercubeVisualizerWithoutTrendExtended).vsualize_year_trend_by_regions_and_altitudes() + + +def main_percentage_trend_poster_2(): + visualizer = get_fast_altitude_visualizer(AltitudeHypercubeVisualizerBisExtended, exact_year=1958) + # visualizer.vsualize_year_trend_by_regions_and_altitudes() + # visualizer.visualize_massif_trend_test_by_altitudes() + visualizer.visualize_massif_trend_test_one_altitude() + # visualizer.visualize_altitute_trend_test_by_regions() + + +def main_run(): + main_mean_log_likelihood_poster_1() + # main_percentage_trend_poster_2() + + +if __name__ == '__main__': + start = time.time() + main_run() + duration = time.time() - start + print('Full run took {}s'.format(round(duration, 1))) diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_fast_hypercube.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_several_altitudes.py similarity index 95% rename from experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_fast_hypercube.py rename to experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_several_altitudes.py index d93208c9b1e75385e0df22d4e5d3f4f15a360859..5b2a3fcf74f596051e4c7f30532a7628c413a314 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_fast_hypercube.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_several_altitudes.py @@ -14,11 +14,14 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat from experiment.trend_analysis.univariate_test.abstract_gev_change_point_test import GevLocationChangePointTest -def get_fast_parameters(): +def get_fast_parameters(altitude=None): save_to_file = False only_first_one = False nb_data_reduced_for_speed = 4 - altitudes = [ALL_ALTITUDES[3], ALL_ALTITUDES[-7]] + if altitude is not None: + altitudes = [altitude] + else: + altitudes = [ALL_ALTITUDES[3], ALL_ALTITUDES[-7]] last_starting_year = None trend_test_class = GevLocationChangePointTest return altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_full_hypercube.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_full_hypercube.py similarity index 89% rename from experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_full_hypercube.py rename to experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_full_hypercube.py index 88160f9ef5e88558dfc5375129929eafe3900935..22ae39ca41e62fd40fd9c3507ac82611d0f99e8f 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_full_hypercube.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_full_hypercube.py @@ -14,18 +14,21 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat from experiment.trend_analysis.univariate_test.abstract_gev_change_point_test import GevLocationChangePointTest -def get_full_parameters(): +def get_full_parameters(altitude=None): save_to_file = True only_first_one = False nb_data_reduced_for_speed = False - altitudes = ALL_ALTITUDES[3:-6] + if altitude is not None: + altitudes = [altitude] + else: + altitudes = ALL_ALTITUDES[3:-6] last_starting_year = 2007 trend_test_class = GevLocationChangePointTest return altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class -def get_full_altitude_visualizer(altitude_hypercube_class, study_classes, exact_starting_year=None): - altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class = get_full_parameters() +def get_full_altitude_visualizer(altitude_hypercube_class, study_classes, exact_starting_year=None, altitude=None): + altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class = get_full_parameters(altitude=altitude) if exact_starting_year is not None: last_starting_year = None visualizer = load_altitude_visualizer(altitude_hypercube_class, altitudes, last_starting_year, @@ -34,9 +37,10 @@ def get_full_altitude_visualizer(altitude_hypercube_class, study_classes, exact_ return visualizer -def get_full_quantity_visualizer(quantity_hypercube_class): - altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class = get_full_parameters() - study_classes = SCM_STUDIES[:3] +def get_full_quantity_visualizer(quantity_hypercube_class, altitude=None, study_classes=None): + altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class = get_full_parameters(altitude=altitude) + if study_classes is None: + study_classes = SCM_STUDIES[:3] visualizer = load_quantity_visualizer(quantity_hypercube_class, altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, study_classes, trend_test_class) diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_poster.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_poster.py new file mode 100644 index 0000000000000000000000000000000000000000..47fff2ff7f36f617e2df2cb3c7e951ea7d1e3690 --- /dev/null +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_poster.py @@ -0,0 +1,47 @@ +from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_hypercube_visualizer_extended import \ + QuantityHypercubeWithoutTrend, AltitudeHypercubeVisualizerBisExtended +from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.main_files.main_fast_hypercube_one_altitudes import \ + get_fast_parameters, get_fast_quantity_visualizer +from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.main_files.main_full_hypercube import \ + get_full_quantity_visualizer, get_full_altitude_visualizer +from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.utils_hypercube import \ + load_altitude_visualizer +from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ + SCM_STUDIES + +POSTER_ALTITUDES = [900, 1800, 2700] + + +def fast_poster(): + for altitude in POSTER_ALTITUDES[:1]: + study_classes = SCM_STUDIES[:2] + results = get_fast_quantity_visualizer(QuantityHypercubeWithoutTrend, + altitude=altitude, + study_classes=study_classes).visualize_year_trend_test(add_detailed_plots=True) + study_class_to_year = dict(zip(study_classes, [t[1] for t in results])) + for study_class, exact_year in study_class_to_year.items(): + altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class = get_fast_parameters( + altitude=altitude) + spatial_visualizer = load_altitude_visualizer(AltitudeHypercubeVisualizerBisExtended, altitudes, + last_starting_year, + nb_data_reduced_for_speed, only_first_one, save_to_file, + [study_class], + trend_test_class, + exact_starting_year=exact_year) + spatial_visualizer.visualize_massif_trend_test_one_altitude() + + +def full_poster(): + for altitude in POSTER_ALTITUDES[:]: + study_classes = SCM_STUDIES[:] + results = get_full_quantity_visualizer(QuantityHypercubeWithoutTrend, + altitude=altitude, + study_classes=study_classes).visualize_year_trend_test(add_detailed_plots=True) + study_class_to_year = dict(zip(study_classes, [t[1] for t in results])) + for study_class, exact_year in study_class_to_year.items(): + spatial_visualizer = get_full_altitude_visualizer(AltitudeHypercubeVisualizerBisExtended, [study_class], exact_starting_year=exact_year, altitude=altitude) + spatial_visualizer.visualize_massif_trend_test_one_altitude() + + +if __name__ == '__main__': + full_poster() diff --git a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py index e37f169dd14068eec27b43f79187c6f34e0e872c..7aa2bc04dde9a5ca128dbf6704398d4373627ce9 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py @@ -18,12 +18,20 @@ from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation. from utils import get_display_name_from_object_type SCM_STUDIES = [SafranSnowfall, CrocusSwe, CrocusDepth] +SCM_STUDY_CLASS_TO_ABBREVIATION = { + SafranSnowfall: 'SF3', + CrocusSwe: 'SWE', + CrocusDepth: 'SD', +} +SCM_STUDY_NAME_TO_ABBREVIATION = {get_display_name_from_object_type(k): v for k, v in SCM_STUDY_CLASS_TO_ABBREVIATION.items()} SCM_STUDY_NAME_TO_COLOR = {get_display_name_from_object_type(s): color - for s, color in zip(SCM_STUDIES, ['r', 'b', 'g'])} + for s, color in zip(SCM_STUDIES, ['tab:orange', 'y', 'tab:purple'])} + SCM_EXTENDED_STUDIES = [ExtendedSafranSnowfall, ExtendedCrocusSwe, ExtendedCrocusDepth] SCM_STUDY_TO_EXTENDED_STUDY = OrderedDict(zip(SCM_STUDIES, SCM_EXTENDED_STUDIES)) ALL_ALTITUDES = [0, 300, 600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600, 3900, 4200, 4500, 4800] +ALTITUDES_LOW_MIDDLE_HIGH = [900, 1800, 2700] ALL_ALTITUDES_WITHOUT_NAN = [300, 600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600, 3900, 4200, 4500, 4800] full_altitude_with_at_least_2_stations = [0, 300, 600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600, 3900, 4200] diff --git a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py index 3eef090005d5a469d9630563cb943eb1308d76b3..17e181c2109e7b96a4e0858bf3ed6383f854ed0b 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py @@ -399,17 +399,21 @@ class StudyVisualizer(VisualizationParameters): def massif_name_to_gev_change_point_test_results(self, trend_test_class_for_change_point_test, starting_years_for_change_point_test, - nb_massif_for_change_point_test=None): + nb_massif_for_change_point_test=None, + sample_one_massif_from_each_region=True): if self.trend_test_class_for_change_point_test is None: # Set the attribute is not already done self.trend_test_class_for_change_point_test = trend_test_class_for_change_point_test self.starting_years_for_change_point_test = starting_years_for_change_point_test self.nb_massif_for_change_point_test = nb_massif_for_change_point_test + self.sample_one_massif_from_each_region = sample_one_massif_from_each_region else: # Check that the argument are the same assert self.trend_test_class_for_change_point_test == trend_test_class_for_change_point_test assert self.starting_years == starting_years_for_change_point_test assert self.nb_massif_for_change_point_test == nb_massif_for_change_point_test + assert self.sample_one_massif_from_each_region == sample_one_massif_from_each_region + return self._massif_name_to_gev_change_point_test_results @cached_property @@ -417,7 +421,7 @@ class StudyVisualizer(VisualizationParameters): massif_name_to_gev_change_point_test_results = {} if self.nb_massif_for_change_point_test is None: massif_names = self.study.study_massif_names - else: + elif self.sample_one_massif_from_each_region: # Get one massif from each region to ensure that the fast plot will not crash assert self.nb_massif_for_change_point_test >= 4, 'we need at least one massif from each region' massif_names = [AbstractExtendedStudy.region_name_to_massif_names[r][0] @@ -425,6 +429,9 @@ class StudyVisualizer(VisualizationParameters): massif_names_for_sampling = list(set(self.study.study_massif_names) - set(massif_names)) nb_massif_for_sampling = self.nb_massif_for_change_point_test - len(AbstractExtendedStudy.real_region_names) massif_names += sample(massif_names_for_sampling, k=nb_massif_for_sampling) + else: + massif_names = sample(self.study.study_massif_names, k=self.nb_massif_for_change_point_test) + for massif_id, massif_name in enumerate(massif_names): years, smooth_maxima = self.smooth_maxima_x_y(massif_id) @@ -437,7 +444,8 @@ class StudyVisualizer(VisualizationParameters): def df_trend_spatio_temporal(self, trend_test_class_for_change_point_test, starting_years_for_change_point_test, - nb_massif_for_change_point_test=None): + nb_massif_for_change_point_test=None, + sample_one_massif_from_each_region=True): """ Index are the massif Columns are the starting year @@ -450,7 +458,8 @@ class StudyVisualizer(VisualizationParameters): massif_name_to_gev_change_point_test_results = self.massif_name_to_gev_change_point_test_results( trend_test_class_for_change_point_test, starting_years_for_change_point_test, - nb_massif_for_change_point_test) + nb_massif_for_change_point_test, + sample_one_massif_from_each_region) for massif_name, gev_change_point_test_results in massif_name_to_gev_change_point_test_results.items(): trend_test_res, best_idxs = gev_change_point_test_results trend_test_res = [(a, b, c) if i in best_idxs else (np.nan, np.nan, c) diff --git a/experiment/trend_analysis/univariate_test/abstract_univariate_test.py b/experiment/trend_analysis/univariate_test/abstract_univariate_test.py index 35b71dba8579c5c1afe88c6a9e9c1c3c6c198d46..252270646e03cb8c3eeed6c27255125e25b3580d 100644 --- a/experiment/trend_analysis/univariate_test/abstract_univariate_test.py +++ b/experiment/trend_analysis/univariate_test/abstract_univariate_test.py @@ -58,7 +58,7 @@ class AbstractUnivariateTest(object): d = OrderedDict() # d[cls.POSITIVE_TREND] = 'g--' # d[cls.NEGATIVE_TREND] = 'r--' - d[cls.ALL_TREND] = 'k-' + # d[cls.ALL_TREND] = 'k-' d[cls.NON_SIGNIFICATIVE_TREND] = 'b-' # d[cls.SIGNIFICATIVE_ALL_TREND] = 'k-' d[cls.SIGNIFICATIVE_POSITIVE_TREND] = 'g-' diff --git a/test/test_experiment/test_SCM_study.py b/test/test_experiment/test_SCM_study.py index c039d98c5badc858cacc8725b575c44cb50cacf5..395e5c2fedc0dc3df23dcd2ca695bda09ef4471f 100644 --- a/test/test_experiment/test_SCM_study.py +++ b/test/test_experiment/test_SCM_study.py @@ -22,7 +22,8 @@ class TestSCMAllStudy(unittest.TestCase): for study_class in [ExtendedSafranSnowfall]: for study in study_iterator(study_class, only_first_one=True, verbose=False): study_visualizer = StudyVisualizer(study, show=False, save_to_file=False, multiprocessing=True) - study_visualizer.df_trend_spatio_temporal(GevLocationChangePointTest, [1958, 1959, 1960], nb_massif_for_change_point_test=3) + study_visualizer.df_trend_spatio_temporal(GevLocationChangePointTest, [1958, 1959, 1960], nb_massif_for_change_point_test=3, + sample_one_massif_from_each_region=False) self.assertTrue(True) def test_instantiate_studies(self): diff --git a/test/test_experiment/test_hypercube.py b/test/test_experiment/test_hypercube.py index 117fe8a3db2cacfa7d859c62295cd66e04c9e229..3609c59c47b70f20dac9b54bce9cc22791e68b59 100644 --- a/test/test_experiment/test_hypercube.py +++ b/test/test_experiment/test_hypercube.py @@ -28,7 +28,7 @@ class TestHypercube(unittest.TestCase): altitudes=altitudes, verbose=self.DISPLAY)] self.altitude_to_visualizer = OrderedDict(zip(altitudes, visualizers)) self.trend_test_class = GevLocationChangePointTest - self.nb_data_reduced_for_speed = 2 + self.nb_data_reduced_for_speed = 4 # def test_altitude_hypercube_visualizer(self): # visualizer = AltitudeHypercubeVisualizer(self.altitude_to_visualizer, save_to_file=False,