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 8508305c86a6d8d05b49e2b8ad0e73506630fc16..fcd7d4eb414f44d93c0f878a00f63b9bb83be4ee 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 @@ -4,6 +4,8 @@ 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 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 @@ -69,6 +71,8 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): if subtitle is None: subtitle = self.study.variable_name[:5] + # 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 return {subtitle: reduction_function_with_level} @@ -136,14 +140,18 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): assert isinstance(serie, pd.Series) xlabel_values = list(serie.index) values = list(serie.values) - if plot_title is not None: argmax_idx = np.argmax(values) best_year = xlabel_values[argmax_idx] - plot_title += '{}'.format(best_year) + plot_title += '{} {}'.format(subtitle, best_year) + + if subtitle in SCM_STUDY_NAME_TO_COLOR: + ax, color, ylabel = ax.twinx(), SCM_STUDY_NAME_TO_COLOR[subtitle], subtitle + else: + color = 'k' ax.set_title(plot_title) - ax.plot(xlabel_values, values) - ax.set_ylabel(ylabel) + ax.plot(xlabel_values, values, label=subtitle, color=color) + ax.set_ylabel(ylabel, color=color) specific_title = 'Evolution of {} trends (significative or not) wrt to the {} with {}'.format(subtitle, xlabel, self.trend_test_name) diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer_extended.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer_extended.py index 3589c2d1b81211cb5ea87f1870305ca133ef6f3b..16c7247c5b46cb7adc3619447bcf36fe3fb9d38c 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer_extended.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer_extended.py @@ -30,7 +30,7 @@ class AltitudeHypercubeVisualizerExtended(AltitudeHypercubeVisualizer): return df def _visualize_meta(self, visualization_function, loading_function, name_to_isin_parameters=None, - multiplication_factor_column=None): + multiplication_factor_column=None, add_detailed_plot=False): assert name_to_isin_parameters is not None, 'this method should not be called directly' if multiplication_factor_column is None: @@ -46,7 +46,8 @@ class AltitudeHypercubeVisualizerExtended(AltitudeHypercubeVisualizer): axes = all_axes[j::multiplication_factor] specific_title = visualization_function(axes, plot_title=name, isin_parameters=isin_parameters, - show_or_save_to_file=False) + show_or_save_to_file=False, + add_detailed_plots=add_detailed_plot) self.show_or_save_to_file(specific_title=specific_title) # Altitude trends @@ -109,15 +110,15 @@ class AltitudeHypercubeVisualizerExtended(AltitudeHypercubeVisualizer): d[name] = isin_parameters return d - def vsualize_year_trend_by_regions_and_altitudes(self): + def vsualize_year_trend_by_regions_and_altitudes(self, add_detailed_plot=False): return self._visualize_meta(visualization_function=self.visualize_year_trend_test, loading_function=self.load_trend_test_evolution_axes_with_columns, name_to_isin_parameters=self.massif_name_and_altitude_band_name_to_isin_parameters, - multiplication_factor_column=len(self.altitude_band_name_to_isin_parameters)) + multiplication_factor_column=len(self.altitude_band_name_to_isin_parameters), + add_detailed_plot=add_detailed_plot) + -class AltitudeHypercubeVisualizerBisExtended(AltitudeHypercubeVisualizerExtended, AltitudeHypercubeVisualizerBis): - pass class AltitudeHypercubeVisualizerWithoutTrendExtended(AltitudeHypercubeVisualizerExtended, @@ -127,6 +128,12 @@ class AltitudeHypercubeVisualizerWithoutTrendExtended(AltitudeHypercubeVisualize return self.isin_slicing(df=super().df_loglikelihood(), isin_parameters=isin_parameters) + +# Extension + +class AltitudeHypercubeVisualizerBisExtended(AltitudeHypercubeVisualizerExtended, AltitudeHypercubeVisualizerBis): + pass + class AltitudeYearHypercubeVisualizerExtended(AltitudeHypercubeVisualizerExtended, Altitude_Hypercube_Year_Visualizer): pass @@ -136,5 +143,6 @@ class AltitudeYearHypercubeVisualizerExtended(AltitudeHypercubeVisualizerExtende class QuantityHypercubeWithoutTrend(AltitudeHypercubeVisualizerWithoutTrendType, QuantityAltitudeHypercubeVisualizer): pass -class QuantityHypercubeWithoutTrendExtended(AltitudeHypercubeVisualizerExtended, QuantityHypercubeWithoutTrend): + +class QuantityHypercubeWithoutTrendExtended(AltitudeHypercubeVisualizerWithoutTrendExtended, QuantityHypercubeWithoutTrend): pass diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/quantity_altitude_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/quantity_altitude_visualizer.py index 7cb8e55dba480f134e4a67a11ad548ff9930ea3d..d668b5c551e55cbad7ebc102949234e1ffbee3e0 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/quantity_altitude_visualizer.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/quantity_altitude_visualizer.py @@ -1,3 +1,5 @@ +from collections import OrderedDict + import pandas as pd from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_hypercube_visualizer import \ @@ -11,23 +13,26 @@ class QuantityAltitudeHypercubeVisualizer(AltitudeHypercubeVisualizer): return 'Quantity Altitude Study' def subtitle_to_reduction_function(self, reduction_function, level=None, add_detailed_plot=False, subtitle=None): - subtitle_to_reduction_function = super().subtitle_to_reduction_function(reduction_function, - level, add_detailed_plot, - 'global') - def get_function_from_tuple(tuple_for_axis_0): - def f(df_bool: pd.DataFrame): + def f(df: pd.DataFrame): # Loc with a tuple with respect the axis 0 - df_bool = df_bool.loc[tuple_for_axis_0, :].copy() + df = df.loc[tuple_for_axis_0, :].copy() # Apply the reduction function - return reduction_function(df_bool) if level is None else reduction_function(df_bool, level-1) + s = reduction_function(df) if level is None else reduction_function(df, level - 1) + return s return f # Add the detailed plot, taken by loc with respect to the first index + subtitle_to_reduction_function = OrderedDict() if add_detailed_plot: tuples_axis_0 = self.tuple_values(idx=0) for tuple_axis_0 in tuples_axis_0: subtitle_to_reduction_function[tuple_axis_0] = get_function_from_tuple(tuple_axis_0) + # Add the super plot at the last rank + subtitle_to_reduction_function.update(super().subtitle_to_reduction_function(reduction_function, + level, add_detailed_plot, + 'global')) + return subtitle_to_reduction_function @property