Skip to content

Commit 267aec5

Browse files
authored
Merge pull request AntSimi#66 from CoriPegliasco/master
fancy figures in ACC detection
2 parents 1f3d119 + e9d42a1 commit 267aec5

File tree

1 file changed

+73
-34
lines changed

1 file changed

+73
-34
lines changed

examples/02_eddy_identification/pet_eddy_detection_ACC.py

Lines changed: 73 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,58 @@
11
"""
2-
Eddy detection : Antartic circum polar
3-
======================================
2+
Eddy detection : Antartic Circumpolar Current
3+
=============================================
44
5-
Script will detect eddies on adt field, and compute u,v with method add_uv(which could use, only if equator is avoid)
5+
This script detect eddies on the ADT field, and compute u,v with the method add_uv (use it only if the Equator is avoided)
66
7-
Two ones with filtering adt and another without
7+
Two detections are provided : with a filtered ADT and without filtering
88
99
"""
1010
from datetime import datetime
1111

1212
from matplotlib import pyplot as plt
13+
from matplotlib import style
1314

1415
from py_eddy_tracker import data
1516
from py_eddy_tracker.dataset.grid import RegularGridDataset
1617

18+
pos_cb = [0.1, 0.52, 0.83, 0.015]
19+
pos_cb2 = [0.1, 0.07, 0.4, 0.015]
20+
1721

1822
def quad_axes(title):
19-
fig = plt.figure(figsize=(13, 8.5))
20-
fig.suptitle(title, weight="bold")
23+
style.use("default")
24+
fig = plt.figure(figsize=(13, 10))
25+
fig.suptitle(title, weight="bold", fontsize=14)
2126
axes = list()
22-
for position in (
23-
[0.05, 0.53, 0.44, 0.44],
24-
[0.53, 0.53, 0.44, 0.44],
25-
[0.05, 0.03, 0.44, 0.44],
26-
[0.53, 0.03, 0.44, 0.44],
27-
):
27+
28+
ax_pos = dict(
29+
topleft=[0.1, 0.54, 0.4, 0.38],
30+
topright=[0.53, 0.54, 0.4, 0.38],
31+
botleft=[0.1, 0.09, 0.4, 0.38],
32+
botright=[0.53, 0.09, 0.4, 0.38],
33+
)
34+
35+
for key, position in ax_pos.items():
2836
ax = fig.add_axes(position)
2937
ax.set_xlim(5, 45), ax.set_ylim(-60, -37)
3038
ax.set_aspect("equal"), ax.grid(True)
3139
axes.append(ax)
32-
return axes
40+
if "right" in key:
41+
ax.set_yticklabels("")
42+
return fig, axes
43+
44+
45+
def set_fancy_labels(fig, ticklabelsize=14, labelsize=14, labelweight="semibold"):
46+
for ax in fig.get_axes():
47+
ax.grid()
48+
ax.grid(which="major", linestyle="-", linewidth="0.5", color="black")
49+
if ax.get_ylabel() != "":
50+
ax.set_ylabel(ax.get_ylabel(), fontsize=labelsize, fontweight=labelweight)
51+
if ax.get_xlabel() != "":
52+
ax.set_xlabel(ax.get_xlabel(), fontsize=labelsize, fontweight=labelweight)
53+
if ax.get_title() != "":
54+
ax.set_title(ax.get_title(), fontsize=labelsize, fontweight=labelweight)
55+
ax.tick_params(labelsize=ticklabelsize)
3356

3457

3558
# %%
@@ -69,20 +92,25 @@ def quad_axes(title):
6992
# %%
7093
# Figures
7194
# -------
72-
axs = quad_axes("General properties field")
73-
m = g_raw.display(axs[0], "adt", vmin=-1, vmax=1, cmap="RdBu_r")
74-
axs[0].set_title("ADT(m)")
75-
m = g.display(axs[1], "adt_low", vmin=-1, vmax=1, cmap="RdBu_r")
76-
axs[1].set_title("ADT (m) large scale with cut at 700 km")
77-
m = g.display(axs[2], "adt", vmin=-1, vmax=1, cmap="RdBu_r")
78-
axs[2].set_title("ADT (m) high scale with cut at 700 km")
79-
cb = plt.colorbar(
80-
m, cax=axs[0].figure.add_axes([0.03, 0.51, 0.94, 0.01]), orientation="horizontal"
81-
)
82-
cb.set_label("ADT(m)", labelpad=-2)
95+
kw_adt = dict(vmin=-1.5, vmax=1.5, cmap=plt.get_cmap("RdBu_r", 30))
96+
fig, axs = quad_axes("General properties field")
97+
m = g_raw.display(axs[0], "adt", **kw_adt)
98+
axs[0].set_title("Total ADT (m)")
99+
m = g.display(axs[1], "adt_low", **kw_adt)
100+
axs[1].set_title("ADT (m) large scale, cutoff at 700 km")
101+
m2 = g.display(axs[2], "adt", cmap=plt.get_cmap("RdBu_r", 20), vmin=-0.5, vmax=0.5)
102+
axs[2].set_title("ADT (m) high-pass filtered, a cutoff at 700 km")
103+
cb = plt.colorbar(m, cax=axs[0].figure.add_axes(pos_cb), orientation="horizontal")
104+
cb.set_label("ADT (m)", labelpad=0)
105+
cb2 = plt.colorbar(m2, cax=axs[2].figure.add_axes(pos_cb2), orientation="horizontal")
106+
cb2.set_label("ADT (m)", labelpad=0)
107+
set_fancy_labels(fig)
108+
109+
# %%
110+
# The large-scale North-South gradient is removed by the filtering step.
83111

84112
# %%
85-
axs = quad_axes("")
113+
fig, axs = quad_axes("")
86114
axs[0].set_title("Without filter")
87115
axs[0].set_ylabel("Contours used in eddies")
88116
axs[1].set_title("With filter")
@@ -91,13 +119,18 @@ def quad_axes(title):
91119
g.contours.display(axs[1], lw=0.5, only_used=True)
92120
g_raw.contours.display(axs[2], lw=0.5, only_unused=True)
93121
g.contours.display(axs[3], lw=0.5, only_unused=True)
122+
set_fancy_labels(fig)
123+
124+
# %%
125+
# Removing the large-scale North-South gradient reveals closed contours in the
126+
# South-Western corner of the ewample region.
94127

95128
# %%
96129
kw = dict(ref=-10, linewidth=0.75)
97130
kw_a = dict(color="r", label="Anticyclonic ({nb_obs} eddies)")
98131
kw_c = dict(color="b", label="Cyclonic ({nb_obs} eddies)")
99132
kw_filled = dict(vmin=0, vmax=100, cmap="Spectral_r", lut=20, intern=True, factor=100)
100-
axs = quad_axes("Comparison between two detection")
133+
fig, axs = quad_axes("Comparison between two detections")
101134
# Match with intern/inner contour
102135
i_a, j_a, s_a = a_.match(a, intern=True, cmin=0.15)
103136
i_c, j_c, s_c = c_.match(c, intern=True, cmin=0.15)
@@ -107,10 +140,8 @@ def quad_axes(title):
107140
c_.index(i_c).filled(axs[0], s_c, **kw_filled)
108141
m = c.index(j_c).filled(axs[1], s_c, **kw_filled)
109142

110-
cb = plt.colorbar(
111-
m, cax=axs[0].figure.add_axes([0.03, 0.51, 0.94, 0.01]), orientation="horizontal"
112-
)
113-
cb.set_label("Similarity index", labelpad=-5)
143+
cb = plt.colorbar(m, cax=axs[0].figure.add_axes(pos_cb), orientation="horizontal")
144+
cb.set_label("Similarity index (%)", labelpad=-5)
114145
a_.display(axs[0], **kw, **kw_a), c_.display(axs[0], **kw, **kw_c)
115146
a.display(axs[1], **kw, **kw_a), c.display(axs[1], **kw, **kw_c)
116147

@@ -124,6 +155,12 @@ def quad_axes(title):
124155

125156
for ax in axs:
126157
ax.legend()
158+
159+
set_fancy_labels(fig)
160+
161+
# %%
162+
# Very similar eddies have Similarity Indexes >= 40%
163+
127164
# %%
128165
# Criteria for rejecting a contour :
129166
# 0. Accepted (green)
@@ -140,10 +177,10 @@ def quad_axes(title):
140177

141178
for i, (label, field, factor, stop) in enumerate(
142179
(
143-
("speed radius (km)", "radius_s", 0.001, 120),
144-
("outter radius (km)", "radius_e", 0.001, 120),
145-
("amplitude (cm)", "amplitude", 100, 25),
146-
("speed max (cm/s)", "speed_average", 100, 25),
180+
("Speed radius (km)", "radius_s", 0.001, 120),
181+
("Effective radius (km)", "radius_e", 0.001, 120),
182+
("Amplitude (cm)", "amplitude", 100, 25),
183+
("Speed max (cm/s)", "speed_average", 100, 25),
147184
)
148185
):
149186
ax = fig.add_subplot(2, 2, i + 1, title=label)
@@ -166,3 +203,5 @@ def quad_axes(title):
166203
ax.plot((0, 1000), (0, 1000), "g")
167204
ax.set_xlim(0, stop), ax.set_ylim(0, stop)
168205
ax.legend()
206+
207+
set_fancy_labels(fig)

0 commit comments

Comments
 (0)