diff --git a/experiment/meteo_france_SCM_study/visualization/hypercube_visualization/__init__.py b/experiment/meteo_france_SCM_study/visualization/hypercube_visualization/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/experiment/meteo_france_SCM_study/visualization/studies_visualization/hypercube_visualizer.py b/experiment/meteo_france_SCM_study/visualization/hypercube_visualization/hypercube_visualizer.py
similarity index 58%
rename from experiment/meteo_france_SCM_study/visualization/studies_visualization/hypercube_visualizer.py
rename to experiment/meteo_france_SCM_study/visualization/hypercube_visualization/hypercube_visualizer.py
index e8af0e1ac653f033cb3f1f5594fd739b71447c8b..e5f6a6540a5e9ec02f74938982cba5699e354d20 100644
--- a/experiment/meteo_france_SCM_study/visualization/studies_visualization/hypercube_visualizer.py
+++ b/experiment/meteo_france_SCM_study/visualization/hypercube_visualization/hypercube_visualizer.py
@@ -6,6 +6,7 @@ import matplotlib.pyplot as plt
 import pandas as pd
 
 from experiment.meteo_france_SCM_study.visualization.study_visualization.study_visualizer import StudyVisualizer
+from experiment.trend_analysis.univariate_trend_test.abstract_trend_test import AbstractTrendTest
 from utils import cached_property, VERSION_TIME, get_display_name_from_object_type
 
 
@@ -88,54 +89,68 @@ class AltitudeHypercubeVisualizer(HypercubeVisualizer):
     @property
     def altitudes(self):
         return list(self.tuple_to_study_visualizer.keys())
+    
+    @property
+    def trend_type_to_style(self):
+        return self.trend_test_class.trend_type_to_style()
 
-    def visualize_altitude_trend_test(self, ax=None, marker='o'):
+    @property
+    def trend_types(self):
+        return self.trend_type_to_style.keys()
+    
+    def trend_type_to_s_percentages(self, reduction_function):
+        # Map each trend type to its serie with percentages
+        trend_type_to_s_percentages = {}
+        for trend_type in self.trend_types:
+            df_bool = (self.df_hypercube == trend_type)
+            # Reduce the entire dataframe to a serie
+            s_percentages = reduction_function(df_bool)
+            assert isinstance(s_percentages, pd.Series)
+            s_percentages *= 100
+            trend_type_to_s_percentages[trend_type] = s_percentages
+        # Post processing - Add the significant trend into the count of normal trend
+        trend_type_to_s_percentages[AbstractTrendTest.POSITIVE_TREND] += trend_type_to_s_percentages[AbstractTrendTest.SIGNIFICATIVE_POSITIVE_TREND]
+        trend_type_to_s_percentages[AbstractTrendTest.NEGATIVE_TREND] += trend_type_to_s_percentages[AbstractTrendTest.SIGNIFICATIVE_NEGATIVE_TREND]
+        return trend_type_to_s_percentages
+    
+    def visualize_trend_test_evolution(self, reduction_function, xlabel, xlabel_values, ax=None, marker='o'):
         if ax is None:
             fig, ax = plt.subplots(1, 1, figsize=self.study_visualizer.figsize)
 
-        # Plot weighted percentages over the years
-        for trend_type, style in self.trend_test_class.trend_type_to_style().items():
-            altitude_percentages = (self.df_hypercube == trend_type)
-            # Take the mean with respect to the years
-            altitude_percentages = altitude_percentages.mean(axis=1)
-            # Take the mean with respect the massifs
-            altitude_percentages = altitude_percentages.mean(axis=0, level=0)
-            # Take the numpy array
-            altitude_percentages = altitude_percentages.values * 100
-            # Plot
-            ax.plot(self.altitudes, altitude_percentages, style + marker, label=trend_type)
+        trend_type_to_s_percentages = self.trend_type_to_s_percentages(reduction_function)
+        for trend_type in self.trend_types:
+            style = self.trend_type_to_style[trend_type]
+            s_percentages = trend_type_to_s_percentages[trend_type]
+            ax.plot(xlabel_values, s_percentages.values, style + marker, label=trend_type)
 
         # Global information
         added_str = 'weighted '
-        ylabel = '% averaged on massifs & {}averaged on starting years'.format(added_str)
+        ylabel = '% averaged on massifs & {}averaged on {}'.format(added_str, xlabel)
         ylabel += ' (with uniform weights)'
         ax.set_ylabel(ylabel)
-        ax.set_xlabel('altitude')
-        ax.set_xticks(self.altitudes)
+        ax.set_xlabel(xlabel)
+        ax.set_xticks(xlabel_values)
         ax.set_yticks(list(range(0, 101, 10)))
         ax.grid()
         ax.legend()
 
         variable_name = self.study.variable_class.NAME
         name = get_display_name_from_object_type(self.trend_test_class)
-        title = 'Evolution of {} trends (significative or not) wrt to the altitude with {}'.format(variable_name,name)
+        title = 'Evolution of {} trends (significative or not) wrt to the {} with {}'.format(variable_name, xlabel,
+                                                                                             name)
         ax.set_title(title)
         self.show_or_save_to_file(specific_title=title)
 
-    def visualize_spatial_trend_test(self, axes=None):
+    def visualize_trend_test_repartition(self, reduction_function, axes=None):
         if axes is None:
             nb_trend_type = len(self.trend_test_class.trend_type_to_style())
             fig, axes = plt.subplots(1, nb_trend_type, figsize=self.study_visualizer.figsize)
 
         # Plot weighted percentages over the years
-        for ax, (trend_type, style) in zip(axes, self.trend_test_class.trend_type_to_style().items()):
-            spatial_percentages = (self.df_hypercube == trend_type)
-            # Take the mean with respect to the years
-            spatial_percentages = spatial_percentages.mean(axis=1)
-            # Take the mean with respect the altitude
-            spatial_percentages = spatial_percentages.mean(axis=0, level=1) * 100
-            # Plot values
-            massif_to_value = dict(spatial_percentages)
+        trend_type_to_s_percentages = self.trend_type_to_s_percentages(reduction_function)
+        for ax, trend_type in zip(axes, self.trend_types):
+            s_percentages = trend_type_to_s_percentages[trend_type]
+            massif_to_value = dict(s_percentages)
             cmap = self.trend_test_class.get_cmap_from_trend_type(trend_type)
             self.study.visualize_study(ax, massif_to_value, show=False, cmap=cmap, label=None)
             ax.set_title(trend_type)
@@ -143,11 +158,40 @@ class AltitudeHypercubeVisualizer(HypercubeVisualizer):
         # Global information
         name = get_display_name_from_object_type(self.trend_test_class)
         title = 'Repartition of trends (significative or not) with {}'.format(name)
-        title +=  '\n(in % averaged on altitudes & averaged on starting years)'
+        title += '\n(in % averaged on altitudes & averaged on starting years)'
         StudyVisualizer.clean_axes_write_title_on_the_left(axes, title, left_border=None)
         plt.suptitle(title)
         self.show_or_save_to_file(specific_title=title)
 
+    def visualize_year_trend_test(self, ax=None, marker='o'):
+        def year_reduction(df_bool):
+            # Take the mean with respect the massifs
+            df_bool = df_bool.mean(axis=0, level=0)
+            # Take the mean with respect to the altitude
+            return df_bool.mean(axis=0)
+
+        self.visualize_trend_test_evolution(reduction_function=year_reduction, xlabel='starting years',
+                                            xlabel_values=self.starting_years, ax=ax, marker=marker)
+
+    def visualize_altitude_trend_test(self, ax=None, marker='o'):
+        def altitude_reduction(df_bool):
+            # Take the mean with respect to the years
+            df_bool = df_bool.mean(axis=1)
+            # Take the mean with respect the massifs
+            return df_bool.mean(axis=0, level=0)
+
+        self.visualize_trend_test_evolution(reduction_function=altitude_reduction, xlabel='altitude',
+                                            xlabel_values=self.altitudes, ax=ax, marker=marker)
+
+    def visualize_massif_trend_test(self, axes=None):
+        def massif_reduction(df_bool):
+            # Take the mean with respect to the years
+            df_bool = df_bool.mean(axis=1)
+            # Take the mean with respect the altitude
+            return df_bool.mean(axis=0, level=1)
+
+        self.visualize_trend_test_repartition(massif_reduction, axes)
+
 
 class QuantitityAltitudeHypercubeVisualizer(HypercubeVisualizer):
     pass
diff --git a/experiment/meteo_france_SCM_study/visualization/hypercube_visualization/main_hypercube_visualization.py b/experiment/meteo_france_SCM_study/visualization/hypercube_visualization/main_hypercube_visualization.py
new file mode 100644
index 0000000000000000000000000000000000000000..800229b1b88cf74386feafdcb28d1fc5405f0cad
--- /dev/null
+++ b/experiment/meteo_france_SCM_study/visualization/hypercube_visualization/main_hypercube_visualization.py
@@ -0,0 +1,61 @@
+import time
+from collections import OrderedDict
+
+from experiment.meteo_france_SCM_study.visualization.hypercube_visualization.hypercube_visualizer import \
+    AltitudeHypercubeVisualizer
+from experiment.meteo_france_SCM_study.visualization.study_visualization.main_study_visualizer import ALL_ALTITUDES, \
+    SCM_STUDIES, study_iterator
+from experiment.meteo_france_SCM_study.visualization.study_visualization.study_visualizer import StudyVisualizer
+from experiment.trend_analysis.univariate_trend_test.abstract_gev_trend_test import GevLocationTrendTest, \
+    GevScaleTrendTest, GevShapeTrendTest
+from experiment.trend_analysis.univariate_trend_test.abstract_trend_test import MannKendallTrendTest
+
+
+def altitude_trend_with_hypercube():
+    save_to_file = True
+    only_first_one = False
+    fast = False
+    altitudes = ALL_ALTITUDES[3:-6]
+    # altitudes = ALL_ALTITUDES[2:4]
+    for study_class in SCM_STUDIES[:]:
+        for trend_test_class in [MannKendallTrendTest, GevLocationTrendTest, GevScaleTrendTest, GevShapeTrendTest][:]:
+            visualizers = [StudyVisualizer(study, temporal_non_stationarity=True, verbose=False, multiprocessing=True)
+                           for study in study_iterator(study_class=study_class, only_first_one=only_first_one,
+                                                       altitudes=altitudes)]
+            altitude_to_visualizer = OrderedDict(zip(altitudes, visualizers))
+            visualizer = AltitudeHypercubeVisualizer(altitude_to_visualizer, save_to_file=save_to_file,
+                                                     trend_test_class=trend_test_class, fast=fast)
+            visualizer.visualize_altitude_trend_test()
+
+
+def spatial_trend_with_hypercube():
+    save_to_file = False
+    only_first_one = False
+    fast = True
+    # altitudes = ALL_ALTITUDES[3:-6]
+    altitudes = ALL_ALTITUDES[2:4]
+    for study_class in SCM_STUDIES[:1]:
+        for trend_test_class in [MannKendallTrendTest, GevLocationTrendTest, GevScaleTrendTest, GevShapeTrendTest][:1]:
+            visualizers = [StudyVisualizer(study, temporal_non_stationarity=True, verbose=False, multiprocessing=True)
+                           for study in study_iterator(study_class=study_class, only_first_one=only_first_one,
+                                                       altitudes=altitudes)]
+            altitude_to_visualizer = OrderedDict(zip(altitudes, visualizers))
+            visualizer = AltitudeHypercubeVisualizer(altitude_to_visualizer, save_to_file=save_to_file,
+                                                     trend_test_class=trend_test_class, fast=fast)
+            visualizer.visualize_massif_trend_test()
+            visualizer.visualize_year_trend_test()
+            visualizer.visualize_altitude_trend_test()
+
+
+
+def main_run():
+    # altitude_trends()
+    # altitude_trends_significant()
+    spatial_trend_with_hypercube()
+
+
+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_SCM_study/visualization/studies_visualization/main_studies_visualizer.py b/experiment/meteo_france_SCM_study/visualization/studies_visualization/main_studies_visualizer.py
index 62186a2bace3fb3164ad6124ae827c65010fda7f..fc0f64a30d5d47444c0de4659f017c2c34217241 100644
--- a/experiment/meteo_france_SCM_study/visualization/studies_visualization/main_studies_visualizer.py
+++ b/experiment/meteo_france_SCM_study/visualization/studies_visualization/main_studies_visualizer.py
@@ -1,7 +1,7 @@
 import time
 
-from experiment.meteo_france_SCM_study.visualization.studies_visualization.hypercube_visualizer import \
-    HypercubeVisualizer, AltitudeHypercubeVisualizer
+from experiment.meteo_france_SCM_study.visualization.hypercube_visualization.hypercube_visualizer import \
+    AltitudeHypercubeVisualizer
 from experiment.trend_analysis.abstract_score import MannKendall, WeigthedScore, MeanScore, MedianScore
 from experiment.trend_analysis.univariate_trend_test.abstract_gev_trend_test import GevLocationTrendTest, \
     GevScaleTrendTest, GevShapeTrendTest
@@ -59,44 +59,9 @@ def altitude_trends_significant():
         visualizer.trend_tests_percentage_evolution_with_altitude(trend_test_classes, starting_year_to_weights=None)
 
 
-def altitude_trend_with_hypercube():
-    save_to_file = True
-    only_first_one = False
-    fast = False
-    altitudes = ALL_ALTITUDES[3:-6]
-    # altitudes = ALL_ALTITUDES[2:4]
-    for study_class in SCM_STUDIES[:]:
-        for trend_test_class in [MannKendallTrendTest, GevLocationTrendTest, GevScaleTrendTest, GevShapeTrendTest][:]:
-            visualizers = [StudyVisualizer(study, temporal_non_stationarity=True, verbose=False, multiprocessing=True)
-                           for study in study_iterator(study_class=study_class, only_first_one=only_first_one,
-                                                       altitudes=altitudes)]
-            altitude_to_visualizer = OrderedDict(zip(altitudes, visualizers))
-            visualizer = AltitudeHypercubeVisualizer(altitude_to_visualizer, save_to_file=save_to_file,
-                                                     trend_class=trend_test_class, fast=fast)
-            visualizer.visualize_altitude_trend_test()
-
-def spatial_trend_with_hypercube():
-    save_to_file = False
-    only_first_one = False
-    fast = True
-    # altitudes = ALL_ALTITUDES[3:-6]
-    altitudes = ALL_ALTITUDES[2:4]
-    for study_class in SCM_STUDIES[:1]:
-        for trend_test_class in [MannKendallTrendTest, GevLocationTrendTest, GevScaleTrendTest, GevShapeTrendTest][:1]:
-            visualizers = [StudyVisualizer(study, temporal_non_stationarity=True, verbose=False, multiprocessing=True)
-                           for study in study_iterator(study_class=study_class, only_first_one=only_first_one,
-                                                       altitudes=altitudes)]
-            altitude_to_visualizer = OrderedDict(zip(altitudes, visualizers))
-            visualizer = AltitudeHypercubeVisualizer(altitude_to_visualizer, save_to_file=save_to_file,
-                                                     trend_test_class=trend_test_class, fast=fast)
-            visualizer.visualize_spatial_trend_test()
-
-
-
 def main_run():
     # altitude_trends()
-    # altitude_trends_significant()
-    spatial_trend_with_hypercube()
+    altitude_trends_significant()
 
 
 if __name__ == '__main__':