Commit 961dc387 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[contrasting] add plot annual maxima time series

parent 613524c6
No related merge requests found
Showing with 46 additions and 3 deletions
+46 -3
......@@ -9,7 +9,7 @@ from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusD
from extreme_data.meteo_france_data.scm_models_data.crocus.crocus_variables import CrocusDensityVariable
from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall, ExtendedSafranSnowfall, \
SafranRainfall, \
SafranTemperature, SafranPrecipitation
SafranTemperature, SafranPrecipitation, SafranSnowfall1Day
from extreme_data.meteo_france_data.scm_models_data.visualization.study_visualizer import \
StudyVisualizer
from projects.exceeding_snow_loads.section_discussion.crocus_study_comparison_with_eurocode import \
......@@ -29,6 +29,7 @@ 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',
SafranSnowfall1Day: 'SF1',
CrocusSweTotal: 'SWE',
CrocusSwe3Days: 'SWE3',
CrocusSnowLoadEurocode: 'GSL from annual maximum of HS \nand {}'.format(eurocode_snow_density),
......
......@@ -4,6 +4,9 @@ from collections import OrderedDict
from cached_property import cached_property
from extreme_data.meteo_france_data.scm_models_data.abstract_study import AbstractStudy
from extreme_data.meteo_france_data.scm_models_data.visualization.main_study_visualizer import \
SCM_STUDY_CLASS_TO_ABBREVIATION
from extreme_data.meteo_france_data.scm_models_data.visualization.study_visualizer import StudyVisualizer
from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
from spatio_temporal_dataset.coordinates.spatial_coordinates.abstract_spatial_coordinates import \
AbstractSpatialCoordinates
......@@ -13,6 +16,7 @@ from spatio_temporal_dataset.coordinates.temporal_coordinates.generated_temporal
ConsecutiveTemporalCoordinates
from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
from spatio_temporal_dataset.spatio_temporal_observations.annual_maxima_observations import AnnualMaxima
import matplotlib.pyplot as plt
class AltitudesStudies(object):
......@@ -20,10 +24,11 @@ class AltitudesStudies(object):
def __init__(self, study_class, altitudes,
spatial_transformation_class=None, temporal_transformation_class=None,
**kwargs_study):
self.study_class = study_class
self.spatial_transformation_class = spatial_transformation_class
self.temporal_transformation_class = temporal_transformation_class
self.altitudes = altitudes
self.altitude_to_study = OrderedDict() # type: OrderedDict[int, AbstractStudy]
self.altitude_to_study = OrderedDict() # type: OrderedDict[int, AbstractStudy]
for altitude in self.altitudes:
study = study_class(altitude=altitude, **kwargs_study)
self.altitude_to_study[altitude] = study
......@@ -34,7 +39,8 @@ class AltitudesStudies(object):
# Dataset Loader
def spatio_temporal_dataset(self, massif_name, s_split_spatial: pd.Series = None, s_split_temporal: pd.Series = None):
def spatio_temporal_dataset(self, massif_name, s_split_spatial: pd.Series = None,
s_split_temporal: pd.Series = None):
coordinates = self.spatio_temporal_coordinates(s_split_spatial, s_split_temporal)
coordinate_values_to_maxima = {}
for altitude in self.altitudes:
......@@ -77,3 +83,33 @@ class AltitudesStudies(object):
def random_s_split_temporal(self, train_split_ratio):
return AbstractCoordinates.temporal_s_split_from_df(self._df_coordinates, train_split_ratio)
# Some visualization
def show_or_save_to_file(self, plot_name, show=False):
study_visualizer = StudyVisualizer(study=self.study, show=show, save_to_file=not show)
study_visualizer.plot_name = plot_name
study_visualizer.show_or_save_to_file(add_classic_title=False)
def plot_maxima_time_series(self, massif_names=None, show=False):
massif_names = massif_names if massif_names is not None else self.study.all_massif_names()
assert isinstance(massif_names, list)
for massif_name in massif_names:
self._plot_maxima_time_series(massif_name, show=show)
def _plot_maxima_time_series(self, massif_name, show=False):
ax = plt.gca()
linewidth = 5
x = self.study.ordered_years
for altitude, study in self.altitude_to_study.items():
y = study.massif_name_to_annual_maxima[massif_name]
label = '{} m'.format(altitude)
ax.plot(x, y, linewidth=linewidth, label=label)
ax.xaxis.set_ticks(x[1::10])
ax.tick_params(axis='both', which='major', labelsize=13)
ax.legend()
plot_name = 'Annual maxima of {} in {}'.format(SCM_STUDY_CLASS_TO_ABBREVIATION[self.study_class], massif_name)
ax.set_ylabel('{} ({})'.format(plot_name, self.study.variable_unit), fontsize=15)
ax.set_xlabel('years', fontsize=15)
self.show_or_save_to_file(plot_name=plot_name, show=show)
ax.clear()
......@@ -17,6 +17,12 @@ class TestAltitudesStudies(unittest.TestCase):
self.studies = AltitudesStudies(study_class, altitudes, year_min=1959, year_max=1962)
class TestVisualization(TestAltitudesStudies):
def test_plot_maxima_time_series(self):
self.studies.plot_maxima_time_series(massif_names=['Vercors'], show=False)
class TestSpatioTemporalCoordinates(TestAltitudesStudies):
def test_temporal_split(self):
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment