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

[HYPERCUBE] add extended massif visualization

parent 645ab9e7
No related merge requests found
Showing with 107 additions and 57 deletions
+107 -57
......@@ -275,7 +275,6 @@ class AbstractStudy(object):
# ax.scatter(x, y)
# ax.text(x, y, massif_name)
# Display the center of the massif
print(massif_names)
masssif_coordinate_for_display = cls.massifs_coordinates_for_display(massif_names)
ax.scatter(masssif_coordinate_for_display.x_coordinates,
......
......@@ -115,7 +115,8 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer):
ax.set_xlabel(xlabel)
ax.grid()
ax.legend()
ax.set_title(plot_title)
if plot_title is not None:
ax.set_title(plot_title)
specific_title = 'Evolution of {} trends (significative or not) wrt to the {} with {}'.format(subtitle, xlabel,
self.trend_test_name)
......@@ -146,7 +147,8 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer):
axes = [axes]
return axes
def visualize_trend_test_repartition(self, reduction_function, axes=None, subtitle='', isin_parameters=None):
def visualize_trend_test_repartition(self, reduction_function, axes=None, subtitle='', isin_parameters=None,
show_or_save_to_file=True, plot_title=None):
if axes is None:
axes = self.load_axes_for_trend_test_repartition(self.nb_rows)
else:
......@@ -162,12 +164,17 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer):
epislon = 0.001 * vmax
vmin -= epislon
vmax += epislon
if i == 0:
vmin, vmax = 0, 100
for ax, display_trend_type in zip(axes_row, self.display_trend_types):
serie = trend_type_to_serie[display_trend_type]
massif_to_value = dict(serie)
cmap = self.trend_test_class.get_cmap_from_trend_type(display_trend_type)
self.study.visualize_study(ax, massif_to_value, show=False, cmap=cmap, label=None, vmax=vmax, vmin=vmin)
ax.set_title(display_trend_type)
self.study.visualize_study(ax, massif_to_value, show=False, cmap=cmap, label=display_trend_type,
vmax=vmax, vmin=vmin)
if plot_title is not None:
ax.set_title(plot_title)
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)
......@@ -175,7 +182,10 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer):
title = 'Repartition of {} trends (significative or not) with {}'.format(subtitle, self.trend_test_name)
title += '\n ' + self.get_title_plot('massifs')
plt.suptitle(title)
self.show_or_save_to_file(specific_title=title)
if show_or_save_to_file:
self.show_or_save_to_file(specific_title=title)
return title
def load_axes_for_trend_test_repartition(self, nb_rows):
nb_trend_type = len(self.display_trend_type_to_style)
......@@ -216,16 +226,22 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer):
level=self.altitude_index_level,
add_detailed_plot=add_detailed_plots).items():
last_result = self.visualize_trend_test_evolution(reduction_function=reduction_function,
xlabel=ALTITUDES_XLABEL,
xlabel_values=self.altitudes, axes=axes, marker=marker,
subtitle=subtitle, isin_parameters=isin_parameters,
show_or_save_to_file=show_or_save_to_file,
plot_title=plot_title)
xlabel=ALTITUDES_XLABEL,
xlabel_values=self.altitudes, axes=axes, marker=marker,
subtitle=subtitle, isin_parameters=isin_parameters,
show_or_save_to_file=show_or_save_to_file,
plot_title=plot_title)
return last_result
def visualize_massif_trend_test(self, axes=None, add_detailed_plots=False, isin_parameters=None):
def visualize_massif_trend_test(self, axes=None, add_detailed_plots=False, plot_title=None,
isin_parameters=None,
show_or_save_to_file=True):
for subtitle, reduction_function in self.subtitle_to_reduction_function(self.index_reduction,
level=self.massif_index_level,
add_detailed_plot=add_detailed_plots).items():
self.visualize_trend_test_repartition(reduction_function, axes, subtitle=subtitle,
isin_parameters=isin_parameters)
last_result = self.visualize_trend_test_repartition(reduction_function, axes, subtitle=subtitle,
isin_parameters=isin_parameters,
plot_title=plot_title,
show_or_save_to_file=show_or_save_to_file)
return last_result
......@@ -23,31 +23,61 @@ class AltitudeHypercubeVisualizerExtended(AltitudeHypercubeVisualizer):
df_bool = res.transpose() if transpose else res
return df_bool
def _visualize_meta(self, visualization_function, loading_function, name_to_isin_parameters=None):
assert name_to_isin_parameters is not None, 'this method should not be called directly'
multiplication_factor = len(name_to_isin_parameters)
all_axes = loading_function(self.nb_rows * multiplication_factor)
specific_title = ''
for j, (name, isin_parameters) in enumerate(name_to_isin_parameters.items()):
axes = all_axes[j::multiplication_factor]
specific_title = visualization_function(axes, plot_title=name,
isin_parameters=isin_parameters,
show_or_save_to_file=False)
self.show_or_save_to_file(specific_title=specific_title)
# Altitude trends
def _visualize_altitude_trend_test(self, name_to_isin_parameters=None):
return self._visualize_meta(visualization_function=self.visualize_altitude_trend_test,
loading_function=self.load_trend_test_evolution_axes,
name_to_isin_parameters=name_to_isin_parameters)
def visualize_altitute_trend_test_by_regions(self):
return self._visualize_altitude_trend_test(name_to_isin_parameters=self.region_name_to_isin_parameters)
@property
def region_name_to_isin_parameters(self):
return {region_name: [(False, values, self.massif_index_level)]
for region_name, values in AbstractExtendedStudy.region_name_to_massif_names.items()}
# Massif trends
def _visualize_massif_trend_test(self, name_to_isin_parameters=None):
return self._visualize_meta(visualization_function=self.visualize_massif_trend_test,
loading_function=self.load_axes_for_trend_test_repartition,
name_to_isin_parameters=name_to_isin_parameters)
def visualize_massif_trend_test_by_altitudes(self):
return self._visualize_massif_trend_test(name_to_isin_parameters=self.altitude_band_name_to_isin_parameters)
@property
def nb_regions(self):
return len(self.region_name_to_isin_parameters)
def altitude_band_name_to_values(self):
altitude_band = 1000
group_idxs = [a // altitude_band for a in self.altitudes]
altitude_band_name_to_values = {'All altitudes': self.altitudes}
for group_idx in set(group_idxs):
values = [a for a, i in zip(self.altitudes, group_idxs) if i == group_idx]
altitude_band_name = '{}m <= altitude <={}m'.format(group_idx * altitude_band,
(group_idx + 1) * altitude_band)
altitude_band_name_to_values[altitude_band_name] = values
return altitude_band_name_to_values
@property
def altitude_band_name_to_isin_parameters(self):
return self.altitudes
return {altitude_band_name: [(False, values, self.altitude_index_level)]
for altitude_band_name, values in self.altitude_band_name_to_values.items()}
def visualize_altitute_trend_test_by_regions(self):
return self._visualize_altitude_trend_test(name_to_isin_parameters=self.region_name_to_isin_parameters)
def _visualize_altitude_trend_test(self, name_to_isin_parameters=None):
assert name_to_isin_parameters is not None, 'this method should not be called directly'
multiplication_factor = len(name_to_isin_parameters)
all_axes = self.load_trend_test_evolution_axes(self.nb_rows * multiplication_factor)
specific_title = ''
for j, (name, isin_parameters) in enumerate(name_to_isin_parameters.items()):
axes = all_axes[j::multiplication_factor]
specific_title = self.visualize_altitude_trend_test(axes, plot_title=name, isin_parameters=isin_parameters, show_or_save_to_file=False)
print(specific_title)
self.show_or_save_to_file(specific_title=specific_title)
class AltitudeHypercubeVisualizerBisExtended(AltitudeHypercubeVisualizerExtended, AltitudeHypercubeVisualizerBis):
......
......@@ -116,8 +116,10 @@ def fast_altitude_year_hypercube_extended():
nb_data_reduced_for_speed=nb_data_reduced_for_speed,
last_starting_year=last_starting_year)
# visualizer.visualize_year_trend_test()
visualizer.visualize_altitude_trend_test()
visualizer.visualize_altitute_trend_test_by_regions()
# visualizer.visualize_altitude_trend_test()
visualizer.visualize_massif_trend_test_by_altitudes()
# visualizer.visualize_massif_trend_test_by_altitudes()
# visualizer.visualize_altitute_trend_test_by_regions()
# visualizer.visualize_massif_trend_test()
......@@ -154,22 +156,24 @@ def full_altitude_year_hypercube_extended():
for study_class in SCM_STUDIES[:1]:
for trend_test_class in [GevLocationChangePointTest, GevScaleChangePointTest,
GevShapeChangePointTest][:1]:
years = [1967, 1977, 1987, 1997, 2007, None][-2:-1][::-1]
years = [1967, 1977, 1987, 1997, 2007, None][-2:][::-1]
for last_starting_year in years:
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 = AltitudeHypercubeVisualizerBisExtended(altitude_to_visualizer,
save_to_file=save_to_file,
trend_test_class=trend_test_class,
nb_data_reduced_for_speed=nb_data_reduced_for_speed,
last_starting_year=last_starting_year)
visualizer.visualize_altitute_trend_test_by_regions()
# visualizer.visualize_year_trend_test()
# visualizer.visualize_massif_trend_test()
visualizer.visualize_altitude_trend_test()
for days in [1, 3]:
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, nb_consecutive_days=days)]
altitude_to_visualizer = OrderedDict(zip(altitudes, visualizers))
visualizer = AltitudeHypercubeVisualizerBisExtended(altitude_to_visualizer,
save_to_file=save_to_file,
trend_test_class=trend_test_class,
nb_data_reduced_for_speed=nb_data_reduced_for_speed,
last_starting_year=last_starting_year,
)
visualizer.visualize_altitute_trend_test_by_regions()
# visualizer.visualize_year_trend_test()
# visualizer.visualize_massif_trend_test()
# visualizer.visualize_altitude_trend_test()
def fast_quantity_altitude_hypercube():
......@@ -196,9 +200,9 @@ def main_run():
# fast_altitude_hypercube()
# fast_altitude_year_hypercube()
# fast_altitude_year_hypercube_extended()
fast_altitude_year_hypercube_extended()
# full_altitude_year_hypercube_extended()
full_altitude_year_hypercube()
# full_altitude_year_hypercube()
# fast_quantity_altitude_hypercube()
# full_quantity_altitude_hypercube()
......
......@@ -405,7 +405,7 @@ class StudyVisualizer(VisualizationParameters):
self.starting_years_for_change_point_test = starting_years_for_change_point_test
self.nb_massif_for_change_point_test = nb_massif_for_change_point_test
else:
# Check that the argument are the same
# Check that the argument are the same
assert self.trend_test_class_for_change_point_test == trend_test_class_for_change_point_test
assert self.starting_years == starting_years_for_change_point_test
assert self.nb_massif_for_change_point_test == nb_massif_for_change_point_test
......@@ -421,11 +421,13 @@ class StudyVisualizer(VisualizationParameters):
years, smooth_maxima = self.smooth_maxima_x_y(massif_id)
gev_change_point_test_results = compute_gev_change_point_test_results(self.multiprocessing, smooth_maxima,
self.starting_years_for_change_point_test,
self.trend_test_class_for_change_point_test, years)
self.trend_test_class_for_change_point_test,
years)
massif_name_to_gev_change_point_test_results[massif_name] = gev_change_point_test_results
return massif_name_to_gev_change_point_test_results
def df_trend_spatio_temporal(self, trend_test_class_for_change_point_test, starting_years_for_change_point_test,
def df_trend_spatio_temporal(self, trend_test_class_for_change_point_test,
starting_years_for_change_point_test,
nb_massif_for_change_point_test=None):
"""
Index are the massif
......@@ -435,12 +437,11 @@ class StudyVisualizer(VisualizationParameters):
:param starting_year_to_weight:
:return:
"""
# Set the attributes
massif_name_to_trend_res = {}
massif_name_to_gev_change_point_test_results = self.massif_name_to_gev_change_point_test_results(trend_test_class_for_change_point_test,
starting_years_for_change_point_test,
nb_massif_for_change_point_test)
massif_name_to_gev_change_point_test_results = self.massif_name_to_gev_change_point_test_results(
trend_test_class_for_change_point_test,
starting_years_for_change_point_test,
nb_massif_for_change_point_test)
for massif_name, gev_change_point_test_results in massif_name_to_gev_change_point_test_results.items():
trend_test_res, best_idxs = gev_change_point_test_results
trend_test_res = [(a, b) if i in best_idxs else (np.nan, np.nan)
......
......@@ -17,7 +17,7 @@ from extreme_estimator.extreme_models.utils import set_seed_for_test
class TestHypercube(unittest.TestCase):
DISPLAY = True
DISPLAY = False
def setUp(self) -> None:
set_seed_for_test(42)
......
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