diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/abstract_hypercube_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/abstract_hypercube_visualizer.py index 58f19cbab74fdf81bae4062bf389dc1ec0e53daa..a03e27407f6fba9790614d74786e9ab0549f81ad 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/abstract_hypercube_visualizer.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/abstract_hypercube_visualizer.py @@ -100,7 +100,7 @@ class AbstractHypercubeVisualizer(object): def study_title(self): return self.study.title - def show_or_save_to_file(self, specific_title=''): + def show_or_save_to_file(self, specific_title='', tight=False): if self.save_to_file: main_title, *_ = '_'.join(self.study_title.split()).split('/') filename = "{}/{}/".format(VERSION_TIME, main_title) @@ -109,7 +109,10 @@ class AbstractHypercubeVisualizer(object): dirname = op.dirname(filepath) if not op.exists(dirname): os.makedirs(dirname, exist_ok=True) - plt.savefig(filepath) + if tight: + plt.savefig(filepath, bbox_inches='tight', pad_inches=-0.03) + else: + plt.savefig(filepath) else: plt.show() plt.close() 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 4d5cbc1ba23002a3925a26c5611577622e09ad4f..3c39ac8d5dc4c74dba8e5388597644465ac0bfad 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 @@ -1,6 +1,7 @@ import numpy as np import pandas as pd import matplotlib.pyplot as plt +from matplotlib.ticker import FormatStrFormatter, ScalarFormatter from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.abstract_hypercube_visualizer import \ AbstractHypercubeVisualizer @@ -14,6 +15,12 @@ ALTITUDES_XLABEL = 'altitudes' STARTING_YEARS_XLABEL = 'starting years' +from math import log10, floor + + +def round_sig(x, sig=2): + return round(x, sig - int(floor(log10(abs(x)))) - 1) + def make_patch_spines_invisible(ax): ax.set_frame_on(True) @@ -102,7 +109,8 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): def visualize_trend_test_evolution(self, reduction_function, xlabel, xlabel_values, axes=None, marker='o', subtitle='', isin_parameters=None, - plot_title=None, idx_reduction=None): + plot_title=None, idx_reduction=None, + poster_plot=False): # Plot in one graph several graph that correspond to the same trend_type trend_type_to_series = self.trend_type_to_series(reduction_function, isin_parameters) @@ -153,13 +161,14 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): ax_reversed, color = ax.twinx(), SCM_STUDY_NAME_TO_COLOR[subtitle] ylabel = 'mean logLik for ' + 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) - ax_reversed.axvline(x=best_year, color=color, linestyle='--') + linewidth = 10 if poster_plot else None + ax_reversed.plot(xlabel_values, values, label=ylabel, color=color, linewidth=linewidth) + fontsize = 30 if poster_plot else None + ax_reversed.set_ylabel(ylabel, color=color, fontsize=fontsize, labelpad=-20) + ax_reversed.axvline(x=best_year, color=color, linestyle='--', linewidth=linewidth) # Offset the right spine of par2. The ticks and label have already been # placed on the right by twinx above. - factor = SCM_STUDIES_NAMES.index(subtitle) position = 1 + idx_reduction * 0.08 if idx_reduction > 0: ax_reversed.spines["right"].set_position(("axes", position)) @@ -169,11 +178,21 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): make_patch_spines_invisible(ax_reversed) # Second, show the right spine. ax_reversed.spines["right"].set_visible(True) + if poster_plot: + # ax_reversed.yaxis.set_major_formatter(FormatStrFormatter('%.1f')) + ax_reversed.yaxis.set_major_formatter(ScalarFormatter(useMathText=True)) + # ax_reversed.tick_params(axis='both', which='major', labelsize=15) + ax_reversed.tick_params(axis='y', which='major', labelsize=25) + # ax.tick_params(axis='x', which='major', labelsize=20) + ax.tick_params(axis='x', which='major', labelsize=25) + + ax_reversed.yaxis.set_ticks([np.round(min(values), 1), np.round(max(values), 1)]) else: ax.set_title(plot_title) # ax.legend() # Common things to all the graph - ax.set_xlabel(xlabel) + if not poster_plot: + ax.set_xlabel(xlabel) plt.setp(ax.get_yticklabels(), visible=False) specific_title = self.specific_title_trend_evolution(subtitle, xlabel, loglik_title=len(axes_remaining) > 0) @@ -190,7 +209,8 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): # percents = [np.round(p) for p in percents] # specific_title += 'Total ' if xlabel == STARTING_YEARS_XLABEL else 'Mean ' # specific_title += 'all trend {}, all significative trends: {} (+:{} -{})'.format(*percents) - plt.suptitle(specific_title) + if not poster_plot: + plt.suptitle(specific_title) return specific_title, best_year @@ -270,21 +290,25 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): massif_to_value = dict(serie) 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) + self.study.visualize_study(ax, massif_name_to_color=massif_to_color, show=False, + show_label=False, scaled=True) + + # ax('scaled') + # if plot_title is not None: + # ax.set_title(plot_title) + title = self.set_trend_test_reparition_title(subtitle, set=False) + # 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) - title = self.set_trend_test_reparition_title(subtitle) - return title - def set_trend_test_reparition_title(self, subtitle): + def set_trend_test_reparition_title(self, subtitle, set=True): # Global information title = 'Repartition of {} trends'.format(subtitle) title += ' at altitude={}m for the starting_year={}'.format(self.altitudes[0], self.starting_years[0]) - plt.suptitle(title) + if set: + plt.suptitle(title) return title def load_axes_for_trend_test_repartition(self, nb_rows, nb_columns=None): @@ -311,7 +335,8 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): def visualize_year_trend_test(self, axes=None, marker='o', add_detailed_plots=False, plot_title=None, isin_parameters=None, show_or_save_to_file=True, - subtitle_specified=None): + subtitle_specified=None, + poster_plot=False): if axes is None: axes = self.load_trend_test_evolution_axes(self.nb_rows) else: @@ -330,12 +355,14 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): subtitle=subtitle, isin_parameters=isin_parameters, plot_title=plot_title, - idx_reduction=idx_reduction + idx_reduction=idx_reduction, + poster_plot=poster_plot ) results.append((specific_title, best_year, subtitle)) if show_or_save_to_file: last_specific_title = results[-1][0] - self.show_or_save_to_file(specific_title=last_specific_title) + self.show_or_save_to_file(specific_title=last_specific_title, + ) return results @staticmethod @@ -397,6 +424,6 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): isin_parameters=isin_parameters, plot_title=plot_title) if show_or_save_to_file: - self.show_or_save_to_file(specific_title=last_title) + self.show_or_save_to_file(specific_title=last_title, tight=True) return last_title 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 index 8d0bfa7fb9cb07ac3045ee2cce59aba95bd80b40..a4c57959adf59c1339aadc8cb85eb3e48a96525f 100644 --- 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 @@ -44,7 +44,7 @@ def get_fast_quantity_visualizer(quantity_hypercube_class, altitude=1800, study_ 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) + res = get_fast_quantity_visualizer(QuantityHypercubeWithoutTrend).visualize_year_trend_test(add_detailed_plots=True, poster_plot=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() @@ -59,8 +59,8 @@ def main_percentage_trend_poster_2(): def main_run(): - # main_mean_log_likelihood_poster_1() - main_percentage_trend_poster_2() + main_mean_log_likelihood_poster_1() + # main_percentage_trend_poster_2() if __name__ == '__main__': 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 index 1c18eba9e3dd5bb00f9539923c4aa83496d7dc14..85bc2eb502602ceb904aa90ae0eb0d1a153324dd 100644 --- 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 @@ -8,7 +8,7 @@ from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visual 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, altitude_massif_name_and_study_class_for_poster + SCM_STUDIES, altitude_massif_name_and_study_class_for_poster, SCM_STUDIES_NAMES, SCM_STUDY_NAME_TO_SCM_STUDY from utils import get_display_name_from_object_type POSTER_ALTITUDES = [900, 1800, 2700] @@ -37,12 +37,14 @@ def fast_poster(): 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( + visualizer = get_full_quantity_visualizer(QuantityHypercubeWithoutTrend, altitude=altitude, + study_classes=study_classes) + results = visualizer.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(): + study_name_to_year = dict(zip(visualizer.quantities, [t[1] for t in results])) + for study_name, exact_year in study_name_to_year.items(): + print(study_name, exact_year) + study_class = SCM_STUDY_NAME_TO_SCM_STUDY[study_name] spatial_visualizer = get_full_altitude_visualizer(AltitudeHypercubeVisualizerBisExtended, [study_class], exact_starting_year=exact_year, altitude=altitude) spatial_visualizer.visualize_massif_trend_test_one_altitude() @@ -58,5 +60,5 @@ def example_for_the_starting_years(): if __name__ == '__main__': - full_poster() - # example_for_the_starting_years() + # full_poster() + example_for_the_starting_years() 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 10999fdb733e05fa9e7bd7c3c4727bd5e10eb7c8..162f32612edf2ca5aa642a3d0fb9b3e54928c2cc 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 @@ -20,6 +20,7 @@ from utils import get_display_name_from_object_type SCM_STUDIES = [SafranSnowfall, CrocusSwe, CrocusDepth] SCM_STUDIES_NAMES = [get_display_name_from_object_type(k) for k in SCM_STUDIES] +SCM_STUDY_NAME_TO_SCM_STUDY = dict(zip(SCM_STUDIES_NAMES, SCM_STUDIES)) SCM_STUDY_CLASS_TO_ABBREVIATION = { SafranSnowfall: 'SF3', CrocusSwe: 'SWE', @@ -28,7 +29,7 @@ SCM_STUDY_CLASS_TO_ABBREVIATION = { altitude_massif_name_and_study_class_for_poster = [ (900, 'Chartreuse', CrocusSwe), - (1800, 'Vercors', CrocusDepth), + (1800, 'Vanoise', CrocusDepth), (2700, 'Parpaillon', SafranSnowfall), ] @@ -240,7 +241,8 @@ def max_graph_annual_maxima_poster(): multiprocessing=True) snow_abbreviation = SCM_STUDY_CLASS_TO_ABBREVIATION[study_class] color = SCM_STUDY_CLASS_TO_COLOR[study_class] - study_visualizer.visualize_max_graphs_poster(massif_name, altitude, snow_abbreviation, color) + # study_visualizer.visualize_max_graphs_poster(massif_name, altitude, snow_abbreviation, color) + study_visualizer.visualize_gev_graphs_poster(massif_name, altitude, snow_abbreviation, color) def altitude_analysis(): 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 825fc91b2a2443f1b4ecce0829236781e345fcec..0c60d348b5b350c031ef14c7afa5156858022ba2 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 @@ -602,6 +602,36 @@ class StudyVisualizer(VisualizationParameters): self.show_or_save_to_file(add_classic_title=False, no_title=True) ax.clear() + @staticmethod + def round_sig(x, sig=2): + return round(x, sig - int(math.floor(math.log10(abs(x)))) - 1) + + def visualize_gev_graphs_poster(self, massif_name, altitude, snow_abbreviation, color): + massif_names = self.study.study_massif_names + # Display the graph of the max on top + ax = plt.gca() + _, y = self.smooth_maxima_x_y(massif_names.index(massif_name)) + d = IsmevGevFit(x_gev=y).gev_params + # Round up + d = {k: self.round_sig(v, 2) for k, v in d.items()} + + print(d) + gev_param = GevParams.from_dict(d) + x_gev = np.linspace(0.0, 1.5 * max(y), num=1000) + y_gev = [gev_param.density(x) for x in x_gev] + ax.plot(x_gev, y_gev, color=color, linewidth=5) + ax.set_xlabel('y = annual maxima of {} (in {})'.format(snow_abbreviation, self.study.variable_unit), color=color, fontsize=15) + ax.set_ylabel('$f_{GEV}' + '(y|\mu={},\sigma={},\zeta={})$'.format(*gev_param.to_array()), fontsize=15) + ax.tick_params(axis='both', which='major', labelsize=13) + + # self.visualize_massif_graphs(self.visualize_mean_and_max_graph, + # specified_massif_ids=specified_massif_ids) + plot_name = 'Gev annual maxima of {} in {} at {}m'.format(snow_abbreviation, massif_name, altitude) + self.plot_name = plot_name + self.show_or_save_to_file(add_classic_title=False, no_title=True) + ax.clear() + + def visualize_mean_and_max_graph(self, ax, massif_id): # Display the graph of the max on top color_maxima = 'r' @@ -735,7 +765,9 @@ class StudyVisualizer(VisualizationParameters): label_function(full_title) ax0.tick_params(axis=u'both', which=u'both', length=0) - def show_or_save_to_file(self, add_classic_title=True, no_title=False): + def show_or_save_to_file(self, add_classic_title=True, no_title=False, tight_layout=False): + if tight_layout: + plt.tight_layout() assert self.plot_name is not None if add_classic_title: title = self.study.title