From d4e81cddc608c9201b7583ba7886a95948cd6bd4 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Mon, 18 Mar 2019 17:02:02 +0100
Subject: [PATCH] [SCM] improve labels for the margin law visualizer in
 study_visualizer

---
 experiment/meteo_france_SCM_study/abstract_study.py    |  8 +++++++-
 .../study_visualization/main_study_visualizer.py       |  8 ++++----
 .../study_visualization/study_visualizer.py            |  7 +++++--
 .../meteo_france_SCM_study/visualization/utils.py      | 10 ++++++++++
 4 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/experiment/meteo_france_SCM_study/abstract_study.py b/experiment/meteo_france_SCM_study/abstract_study.py
index a23316fe..e46e3f62 100644
--- a/experiment/meteo_france_SCM_study/abstract_study.py
+++ b/experiment/meteo_france_SCM_study/abstract_study.py
@@ -9,6 +9,7 @@ from netCDF4 import Dataset
 
 from experiment.meteo_france_SCM_study.abstract_variable import AbstractVariable
 from experiment.meteo_france_SCM_study.massif import safran_massif_names_from_datasets
+from experiment.meteo_france_SCM_study.visualization.utils import get_km_formatter
 from extreme_estimator.margin_fits.plot.create_shifted_cmap import get_color_rbga_shifted
 from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
 from spatio_temporal_dataset.coordinates.spatial_coordinates.abstract_spatial_coordinates import \
@@ -171,7 +172,7 @@ class AbstractStudy(object):
             coords_list = list(zip(*coords_list))
             ax.plot(*coords_list, color='black')
             # Potentially, fill the inside of the polygon with some color
-            if fill:
+            if fill and coordinate_id in self.coordinate_id_to_massif_name:
                 massif_name = self.coordinate_id_to_massif_name[coordinate_id]
                 fill_kwargs = massif_name_to_fill_kwargs[massif_name] if massif_name_to_fill_kwargs is not None else {}
                 ax.fill(*coords_list, **fill_kwargs)
@@ -183,6 +184,11 @@ class AbstractStudy(object):
                 # ax.text(x, y, massif_name)
         # Display the center of the massif
         ax.scatter(self.massifs_coordinates.x_coordinates, self.massifs_coordinates.y_coordinates, s=1)
+        # Improve some explanation on the X axis and on the Y axis
+        ax.set_xlabel('Longitude (km)')
+        ax.xaxis.set_major_formatter(get_km_formatter())
+        ax.set_ylabel('Latitude (km)')
+        ax.yaxis.set_major_formatter(get_km_formatter())
         # Display the name or value of the massif
         if add_text:
             for _, row in self.massifs_coordinates.df_all_coordinates.iterrows():
diff --git a/experiment/meteo_france_SCM_study/visualization/study_visualization/main_study_visualizer.py b/experiment/meteo_france_SCM_study/visualization/study_visualization/main_study_visualizer.py
index 592a57eb..d03ff3df 100644
--- a/experiment/meteo_france_SCM_study/visualization/study_visualization/main_study_visualizer.py
+++ b/experiment/meteo_france_SCM_study/visualization/study_visualization/main_study_visualizer.py
@@ -49,15 +49,15 @@ def extended_visualization():
     #         study_visualizer.visualize_all_experimental_law()
 
 
-def annual_mean_vizu_compare_durand_study(safran=True, take_mean_value=True):
+def annual_mean_vizu_compare_durand_study(safran=True, take_mean_value=True, altitude=1800):
     if safran:
         for study_class in [SafranTotalPrecip, SafranRainfall, SafranSnowfall, SafranTemperature][2:3]:
-            study = study_class(altitude=1800, year_min=1958, year_max=2002)
+            study = study_class(altitude=altitude, year_min=1958, year_max=2002)
             study_visualizer = StudyVisualizer(study)
             study_visualizer.visualize_annual_mean_values(take_mean_value=True)
     else:
         for study_class in [CrocusSwe, CrocusDepth, CrocusDaysWithSnowOnGround][-1:]:
-            study = study_class(altitude=1800, year_min=1958, year_max=2005)
+            study = study_class(altitude=altitude, year_min=1958, year_max=2005)
             study_visualizer = StudyVisualizer(study)
             study_visualizer.visualize_annual_mean_values(take_mean_value=take_mean_value)
 
@@ -90,7 +90,7 @@ def complete_analysis(only_first_one=False):
 
 
 if __name__ == '__main__':
-    # annual_mean_vizu_compare_durand_study(safran=True, take_mean_value=True)
+    # annual_mean_vizu_compare_durand_study(safran=True, take_mean_value=True, altitude=2400)
     normal_visualization()
     # extended_visualization()
     # complete_analysis()
diff --git a/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py b/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py
index 50121a0f..d39d41ab 100644
--- a/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py
+++ b/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py
@@ -255,7 +255,7 @@ class StudyVisualizer(object):
 
     @staticmethod
     def clean_axes_write_title_on_the_left(axes, title):
-        for ax in axes:
+        for ax in axes[1:]:
             ax.tick_params(axis=u'both', which=u'both', length=0)
             ax.spines['top'].set_visible(False)
             ax.spines['right'].set_visible(False)
@@ -266,7 +266,10 @@ class StudyVisualizer(object):
             ax.set_aspect('equal')
         ax0 = axes[0]
         ax0.get_yaxis().set_visible(True)
-        ax0.set_ylabel(title)
+        sub_title = ax0.yaxis.get_label()
+        full_title = title + '\n\n' + sub_title._text
+        ax0.set_ylabel(full_title)
+        ax0.set_ylabel(full_title)
         ax0.tick_params(axis=u'both', which=u'both', length=0)
 
     def show_or_save_to_file(self):
diff --git a/experiment/meteo_france_SCM_study/visualization/utils.py b/experiment/meteo_france_SCM_study/visualization/utils.py
index 1a0e4532..970c2aa8 100644
--- a/experiment/meteo_france_SCM_study/visualization/utils.py
+++ b/experiment/meteo_france_SCM_study/visualization/utils.py
@@ -1,6 +1,7 @@
 import matplotlib.pyplot as plt
 import numpy as np
 import pandas as pd
+import matplotlib.ticker as tkr  # has classes for tick-locating and -formatting
 
 
 def plot_df(df: pd.DataFrame, ax=None, ylabel='Example plot', show=True, xlabel='Altitude (m)'):
@@ -25,5 +26,14 @@ def example_plot_df():
     plot_df(df)
 
 
+def get_km_formatter():
+    # From: https://stackoverflow.com/questions/27575257/how-to-divide-ytics-to-a-certain-number-in-matplotlib
+    def numfmt(x, pos):  # your custom formatter function: divide by 1000.0
+        s = '{}'.format(int(x / 1000.0))
+        return s
+
+    return tkr.FuncFormatter(numfmt)  # create your custom formatter function
+
+
 if __name__ == '__main__':
     example_plot_df()
-- 
GitLab