Commit fb667260 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[SCM][SCORE TREND] improve visualisation of studies wrt altitude

parent a7fa4dda
No related merge requests found
Showing with 64 additions and 21 deletions
+64 -21
......@@ -8,7 +8,7 @@ from experiment.meteo_france_SCM_study.visualization.studies_visualization.studi
from experiment.meteo_france_SCM_study.visualization.studies_visualization.studies_visualizer import StudiesVisualizer, \
AltitudeVisualizer
from experiment.meteo_france_SCM_study.visualization.study_visualization.main_study_visualizer import ALL_ALTITUDES, \
study_iterator_global
study_iterator_global, SCM_STUDIES
from experiment.meteo_france_SCM_study.visualization.study_visualization.study_visualizer import StudyVisualizer
from collections import OrderedDict
......@@ -22,18 +22,20 @@ def normal_visualization():
def altitude_trends():
save_to_file = False
save_to_file = True
only_first_one = False
# altitudes that have 20 massifs at least
altitudes = ALL_ALTITUDES[3:-6]
# altitudes = ALL_ALTITUDES[:2]
visualizers = [StudyVisualizer(study, save_to_file=save_to_file, temporal_non_stationarity=True, verbose=True,
score_class=MedianScore)
for study in study_iterator_global(study_classes=[SafranSnowfall], only_first_one=only_first_one,
altitudes=altitudes)]
altitude_to_visualizer = OrderedDict(zip(altitudes, visualizers))
visualizer = AltitudeVisualizer(altitude_to_visualizer)
visualizer.negative_trend_percentages_evolution()
for study_class in SCM_STUDIES[:]:
for score_class in [MedianScore, MeanScore, MannKendall, WeigthedScore]:
visualizers = [StudyVisualizer(study, temporal_non_stationarity=True, verbose=True,
score_class=score_class)
for study in study_iterator_global(study_classes=[study_class], only_first_one=only_first_one,
altitudes=altitudes)]
altitude_to_visualizer = OrderedDict(zip(altitudes, visualizers))
visualizer = AltitudeVisualizer(altitude_to_visualizer, multiprocessing=False, save_to_file=save_to_file)
visualizer.negative_trend_percentages_evolution(reverse=True)
if __name__ == '__main__':
......
from collections import OrderedDict, Counter
import os
import os.path as op
from multiprocessing.dummy import Pool
from typing import Dict
import numpy as np
......@@ -11,7 +14,7 @@ from experiment.meteo_france_SCM_study.visualization.studies_visualization.studi
Studies
from experiment.meteo_france_SCM_study.visualization.study_visualization.study_visualizer import StudyVisualizer
from experiment.meteo_france_SCM_study.visualization.utils import plot_df
from utils import cached_property, get_display_name_from_object_type
from utils import cached_property, get_display_name_from_object_type, VERSION_TIME
class StudiesVisualizer(object):
......@@ -40,9 +43,16 @@ class StudiesVisualizer(object):
plot_df(df_mean)
def get_percentages(v):
return v.percentages_of_negative_trends()[0]
class AltitudeVisualizer(object):
def __init__(self, altitude_to_study_visualizer: Dict[int, StudyVisualizer]):
def __init__(self, altitude_to_study_visualizer: Dict[int, StudyVisualizer], multiprocessing=False,
save_to_file=False):
self.save_to_file = save_to_file
self.multiprocessing = multiprocessing
assert isinstance(altitude_to_study_visualizer, OrderedDict)
self.altitude_to_study_visualizer = altitude_to_study_visualizer
......@@ -52,12 +62,21 @@ class AltitudeVisualizer(object):
@cached_property
def all_percentages(self):
return [v.percentages_of_negative_trends()[0] for v in self.altitude_to_study_visualizer.values()]
if self.multiprocessing:
with Pool(4) as p:
l = p.map(get_percentages, list(self.altitude_to_study_visualizer.values()))
else:
l = [get_percentages(v) for v in self.altitude_to_study_visualizer.values()]
return l
@property
def any_study_visualizer(self) -> StudyVisualizer:
return list(self.altitude_to_study_visualizer.values())[0]
@property
def study(self):
return self.any_study_visualizer.study
def get_item_fct(self, year):
idx = self.any_study_visualizer.starting_years.index(year)
f = lambda s: s[idx]
......@@ -78,12 +97,25 @@ class AltitudeVisualizer(object):
years = [y + self.starting_year for y in years]
return years
def negative_trend_percentages_evolution(self):
def show_or_save_to_file(self, specific_title=''):
if self.save_to_file:
main_title, _ = '_'.join(self.study.title.split()).split('/')
filename = "{}/{}/".format(VERSION_TIME, main_title)
filename += specific_title
filepath = op.join(self.study.result_full_path, filename + '.png')
dirname = op.dirname(filepath)
if not op.exists(dirname):
os.makedirs(dirname, exist_ok=True)
plt.savefig(filepath)
else:
plt.show()
def negative_trend_percentages_evolution(self, reverse=True):
curve_name__metric_and_color = [
('max', np.max, 'r'),
('max', np.max, 'g'),
('mean', np.mean, 'b'),
('median', np.median, 'c'),
('min', np.min, 'g'),
('min', np.min, 'r'),
]
# Add some years
# spotted_years = [1963, 1976]
......@@ -94,10 +126,10 @@ class AltitudeVisualizer(object):
# curve_name__metric_and_color.append(new)
for year, marker in zip(self.get_top_potential_years(), str_markers):
new = (str(year), self.get_item_fct(year), 'm', marker + ':')
new = (str(year), self.get_item_fct(year), 'y', marker + ':')
curve_name__metric_and_color.append(new)
for year, marker in zip(self.get_top_potential_years(reverse=True), str_markers):
new = (str(year), self.get_item_fct(year), 'y', marker + ':')
new = (str(year), self.get_item_fct(year), 'm', marker + ':')
curve_name__metric_and_color.append(new)
fig, ax = plt.subplots(1, 1, figsize=self.any_study_visualizer.figsize)
......@@ -105,6 +137,13 @@ class AltitudeVisualizer(object):
marker, curve_name = (marker[0], curve_name + ' starting year') if marker \
else ('-', curve_name + ' over the starting years')
values = [metric(p) for p in self.all_percentages]
if reverse:
values = [100 - v for v in values]
k = ['max', 'min']
for before, new in zip(k, k[::-1]):
if before in curve_name:
curve_name = curve_name.replace(before, new)
break
ax.plot(self.altitudes, values, color + marker, label=curve_name)
ax.legend()
ax.set_xticks(self.altitudes)
......@@ -112,9 +151,11 @@ class AltitudeVisualizer(object):
ax.grid()
ax.axhline(y=50, color='k')
ax.set_ylabel('% of negative trends')
word = 'positive' if reverse else 'negative'
ax.set_ylabel('% of massifs with {} trends'.format(word))
ax.set_xlabel('altitude')
scoer_class_name = get_display_name_from_object_type(self.any_study_visualizer.score_class)
title = 'Distribution of negative trend for the {}'.format(scoer_class_name)
variable_name = self.study.variable_class.NAME
score_name = get_display_name_from_object_type(self.any_study_visualizer.score_class)
title = 'Evolution of {} trends wrt to the altitude with {}'.format(variable_name, score_name)
ax.set_title(title)
plt.show()
self.show_or_save_to_file(specific_title=title)
\ No newline at end of file
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