Skip to content

Commit d5933e1

Browse files
committed
add an entry about sla and adt
1 parent 5854912 commit d5933e1

File tree

5 files changed

+387
-17
lines changed

5 files changed

+387
-17
lines changed

examples/02_eddy_identification/pet_filter_and_detection.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from matplotlib import pyplot as plt
88
from py_eddy_tracker.dataset.grid import RegularGridDataset
99
from py_eddy_tracker import data
10-
from py_eddy_tracker.generic import reverse_index
1110
from numpy import arange
1211

1312

@@ -83,19 +82,16 @@ def update_axes(ax, mappable=None):
8382
# Match detection and compare
8483
# ---------------------------
8584

86-
i, j, c = merge_f.match(merge_r)
87-
m = c > 0.1
88-
i_, j_ = i[m], j[m]
89-
85+
i_, j_, c = merge_f.match(merge_r, 0.1)
9086

9187
# %%
9288
# where is lonely eddies
9389
kwargs_f = dict(lw=1.5, label="Lonely eddy from filtered grid", ref=-10, color="k")
9490
kwargs_r = dict(lw=1.5, label="Lonely eddy from raw grid", ref=-10, color="r")
9591
ax = start_axes("Eddies with no match, over filtered ADT")
9692
mappable = g.display(ax, "adt_high", vmin=-0.15, vmax=0.15)
97-
merge_f.index(reverse_index(i_, len(merge_f))).display(ax, **kwargs_f)
98-
merge_r.index(reverse_index(j_, len(merge_r))).display(ax, **kwargs_r)
93+
merge_f.index(i_, reverse=True).display(ax, **kwargs_f)
94+
merge_r.index(j_, reverse=True).display(ax, **kwargs_r)
9995
ax.legend()
10096
update_axes(ax, mappable)
10197

@@ -104,14 +100,14 @@ def update_axes(ax, mappable=None):
104100
mappable = g.display(ax, "adt_high", vmin=-0.15, vmax=0.15)
105101
u, v = g.grid("u").T, g.grid("v").T
106102
ax.quiver(g.x_c, g.y_c, u, v, scale=10, pivot="mid", color="gray")
107-
merge_f.index(reverse_index(i_, len(merge_f))).display(ax, **kwargs_f)
108-
merge_r.index(reverse_index(j_, len(merge_r))).display(ax, **kwargs_r)
103+
merge_f.index(i_, reverse=True).display(ax, **kwargs_f)
104+
merge_r.index(j_, reverse=True).display(ax, **kwargs_r)
109105
ax.legend()
110106
update_axes(ax, mappable)
111107

112108
# %%
113109
fig = plt.figure(figsize=(12, 12))
114-
fig.suptitle(f"Scatter plot ({m.sum()} matches)")
110+
fig.suptitle(f"Scatter plot ({i_.shape[0]} matches)")
115111

116112
for i, (label, field, factor, stop) in enumerate(
117113
(
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
"""
2+
Eddy detection on SLA and ADT
3+
=============================
4+
5+
"""
6+
from datetime import datetime
7+
from matplotlib import pyplot as plt
8+
from py_eddy_tracker.dataset.grid import RegularGridDataset
9+
from py_eddy_tracker import data
10+
11+
12+
# %%
13+
def start_axes(title):
14+
fig = plt.figure(figsize=(13, 5))
15+
ax = fig.add_axes([0.03, 0.03, 0.90, 0.94])
16+
ax.set_xlim(-6, 36.5), ax.set_ylim(30, 46)
17+
ax.set_aspect("equal")
18+
ax.set_title(title)
19+
return ax
20+
21+
22+
def update_axes(ax, mappable=None):
23+
ax.grid()
24+
if mappable:
25+
plt.colorbar(mappable, cax=ax.figure.add_axes([0.95, 0.05, 0.01, 0.9]))
26+
27+
28+
# %%
29+
# Load Input grid, ADT will be used to detect eddies
30+
31+
g = RegularGridDataset(
32+
data.get_path("dt_med_allsat_phy_l4_20160515_20190101.nc"), "longitude", "latitude",
33+
)
34+
g.add_uv("adt", "ugos", "vgos")
35+
g.add_uv("sla", "ugosa", "vgosa")
36+
wavelength = 400
37+
g.copy("adt", "adt_raw")
38+
g.copy("sla", "sla_raw")
39+
g.bessel_high_filter("adt", wavelength)
40+
g.bessel_high_filter("sla", wavelength)
41+
date = datetime(2016, 5, 15)
42+
43+
# %%
44+
kwargs_a_adt = dict(lw=0.5, label="Anticyclonic ADT", ref=-10, color="k")
45+
kwargs_c_adt = dict(lw=0.5, label="Cyclonic ADT", ref=-10, color="r")
46+
kwargs_a_sla = dict(lw=0.5, label="Anticyclonic SLA", ref=-10, color="g")
47+
kwargs_c_sla = dict(lw=0.5, label="Cyclonic SLA", ref=-10, color="b")
48+
49+
# %%
50+
# Run algorithm of detection
51+
a_adt, c_adt = g.eddy_identification("adt", "ugos", "vgos", date, 0.002)
52+
a_sla, c_sla = g.eddy_identification("sla", "ugosa", "vgosa", date, 0.002)
53+
54+
# %%
55+
# over filtered
56+
ax = start_axes(f"ADT (m) filtered ({wavelength}km)")
57+
m = g.display(ax, "adt", vmin=-0.15, vmax=0.15)
58+
a_adt.display(ax, **kwargs_a_adt), c_adt.display(ax, **kwargs_a_sla)
59+
ax.legend(), update_axes(ax, m)
60+
61+
ax = start_axes(f"SLA (m) filtered ({wavelength}km)")
62+
m = g.display(ax, "sla", vmin=-0.15, vmax=0.15)
63+
a_sla.display(ax, **kwargs_c_adt), c_sla.display(ax, **kwargs_c_sla)
64+
ax.legend(), update_axes(ax, m)
65+
66+
# %%
67+
# over raw
68+
ax = start_axes("ADT (m)")
69+
m = g.display(ax, "adt_raw", vmin=-0.15, vmax=0.15)
70+
a_adt.display(ax, **kwargs_a_adt), c_adt.display(ax, **kwargs_a_sla)
71+
ax.legend(), update_axes(ax, m)
72+
73+
ax = start_axes("SLA (m)")
74+
m = g.display(ax, "sla_raw", vmin=-0.15, vmax=0.15)
75+
a_sla.display(ax, **kwargs_c_adt), c_sla.display(ax, **kwargs_c_sla)
76+
ax.legend(), update_axes(ax, m)
77+
78+
# %%
79+
# Display detection
80+
ax = start_axes("Eddies detected")
81+
a_adt.display(ax, **kwargs_a_adt)
82+
a_sla.display(ax, **kwargs_c_adt)
83+
c_adt.display(ax, **kwargs_a_sla)
84+
c_sla.display(ax, **kwargs_c_sla)
85+
ax.legend()
86+
update_axes(ax)
87+
88+
# %%
89+
# Match
90+
# -----------------------
91+
# Where cyclone meet anticyclone
92+
i_c_adt, i_a_sla, c = c_adt.match(a_sla, 0.1)
93+
i_a_adt, i_c_sla, c = a_adt.match(c_sla, 0.1)
94+
95+
ax = start_axes("Cyclone share area with anticyclone")
96+
a_adt.index(i_a_adt).display(ax, **kwargs_a_adt)
97+
c_adt.index(i_c_adt).display(ax, **kwargs_c_adt)
98+
a_sla.index(i_a_sla).display(ax, **kwargs_a_sla)
99+
c_sla.index(i_c_sla).display(ax, **kwargs_c_sla)
100+
ax.legend()
101+
update_axes(ax)
102+
103+
104+
# %%
105+
# Scatter plot
106+
# ------------
107+
i_a_adt, i_a_sla, c = a_adt.match(a_sla, 0.1)
108+
i_c_adt, i_c_sla, c = c_adt.match(c_sla, 0.1)
109+
110+
# %%
111+
# where is lonely eddies
112+
ax = start_axes("Eddies with no match")
113+
a_adt.index(i_a_adt, reverse=True).display(ax, **kwargs_a_adt)
114+
c_adt.index(i_c_adt, reverse=True).display(ax, **kwargs_c_adt)
115+
a_sla.index(i_a_sla, reverse=True).display(ax, **kwargs_a_sla)
116+
c_sla.index(i_c_sla, reverse=True).display(ax, **kwargs_c_sla)
117+
ax.legend()
118+
update_axes(ax)
119+
120+
# %%
121+
fig = plt.figure(figsize=(12, 12))
122+
fig.suptitle(f"Scatter plot (A : {i_a_adt.shape[0]}, C : {i_c_adt.shape[0]} matches)")
123+
124+
for i, (label, field, factor, stop) in enumerate(
125+
(
126+
("speed radius (km)", "radius_s", 0.001, 80),
127+
("outter radius (km)", "radius_e", 0.001, 120),
128+
("amplitude (cm)", "amplitude", 100, 25),
129+
("speed max (cm/s)", "speed_average", 100, 25),
130+
)
131+
):
132+
ax = fig.add_subplot(2, 2, i + 1, title=label)
133+
ax.set_xlabel("Absolute Dynamic Topography")
134+
ax.set_ylabel("Sea Level Anomaly")
135+
136+
ax.plot(a_adt[field][i_a_adt] * factor, a_sla[field][i_a_sla] * factor, "r.")
137+
ax.plot(c_adt[field][i_c_adt] * factor, c_sla[field][i_c_sla] * factor, "b.")
138+
ax.set_aspect("equal"), ax.grid()
139+
ax.plot((0, 1000), (0, 1000), "g")
140+
ax.set_xlim(0, stop), ax.set_ylim(0, stop)

notebooks/python_module/02_eddy_identification/pet_filter_and_detection.ipynb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
},
2727
"outputs": [],
2828
"source": [
29-
"from datetime import datetime\nfrom matplotlib import pyplot as plt\nfrom py_eddy_tracker.dataset.grid import RegularGridDataset\nfrom py_eddy_tracker import data\nfrom py_eddy_tracker.generic import reverse_index\nfrom numpy import arange"
29+
"from datetime import datetime\nfrom matplotlib import pyplot as plt\nfrom py_eddy_tracker.dataset.grid import RegularGridDataset\nfrom py_eddy_tracker import data\nfrom numpy import arange"
3030
]
3131
},
3232
{
@@ -127,7 +127,7 @@
127127
},
128128
"outputs": [],
129129
"source": [
130-
"i, j, c = merge_f.match(merge_r)\nm = c > 0.1\ni_, j_ = i[m], j[m]"
130+
"i_, j_, c = merge_f.match(merge_r, 0.1)"
131131
]
132132
},
133133
{
@@ -145,7 +145,7 @@
145145
},
146146
"outputs": [],
147147
"source": [
148-
"kwargs_f = dict(lw=1.5, label=\"Lonely eddy from filtered grid\", ref=-10, color=\"k\")\nkwargs_r = dict(lw=1.5, label=\"Lonely eddy from raw grid\", ref=-10, color=\"r\")\nax = start_axes(\"Eddies with no match, over filtered ADT\")\nmappable = g.display(ax, \"adt_high\", vmin=-0.15, vmax=0.15)\nmerge_f.index(reverse_index(i_, len(merge_f))).display(ax, **kwargs_f)\nmerge_r.index(reverse_index(j_, len(merge_r))).display(ax, **kwargs_r)\nax.legend()\nupdate_axes(ax, mappable)\n\nax = start_axes(\"Eddies with no match, over filtered ADT (zoom)\")\nax.set_xlim(25, 36), ax.set_ylim(31, 35.25)\nmappable = g.display(ax, \"adt_high\", vmin=-0.15, vmax=0.15)\nu, v = g.grid(\"u\").T, g.grid(\"v\").T\nax.quiver(g.x_c, g.y_c, u, v, scale=10, pivot=\"mid\", color=\"gray\")\nmerge_f.index(reverse_index(i_, len(merge_f))).display(ax, **kwargs_f)\nmerge_r.index(reverse_index(j_, len(merge_r))).display(ax, **kwargs_r)\nax.legend()\nupdate_axes(ax, mappable)"
148+
"kwargs_f = dict(lw=1.5, label=\"Lonely eddy from filtered grid\", ref=-10, color=\"k\")\nkwargs_r = dict(lw=1.5, label=\"Lonely eddy from raw grid\", ref=-10, color=\"r\")\nax = start_axes(\"Eddies with no match, over filtered ADT\")\nmappable = g.display(ax, \"adt_high\", vmin=-0.15, vmax=0.15)\nmerge_f.index(i_, reverse=True).display(ax, **kwargs_f)\nmerge_r.index(j_, reverse=True).display(ax, **kwargs_r)\nax.legend()\nupdate_axes(ax, mappable)\n\nax = start_axes(\"Eddies with no match, over filtered ADT (zoom)\")\nax.set_xlim(25, 36), ax.set_ylim(31, 35.25)\nmappable = g.display(ax, \"adt_high\", vmin=-0.15, vmax=0.15)\nu, v = g.grid(\"u\").T, g.grid(\"v\").T\nax.quiver(g.x_c, g.y_c, u, v, scale=10, pivot=\"mid\", color=\"gray\")\nmerge_f.index(i_, reverse=True).display(ax, **kwargs_f)\nmerge_r.index(j_, reverse=True).display(ax, **kwargs_r)\nax.legend()\nupdate_axes(ax, mappable)"
149149
]
150150
},
151151
{
@@ -156,7 +156,7 @@
156156
},
157157
"outputs": [],
158158
"source": [
159-
"fig = plt.figure(figsize=(12, 12))\nfig.suptitle(f\"Scatter plot ({m.sum()} matches)\")\n\nfor i, (label, field, factor, stop) in enumerate(\n (\n (\"speed radius (km)\", \"radius_s\", 0.001, 80),\n (\"outter radius (km)\", \"radius_e\", 0.001, 120),\n (\"amplitude (cm)\", \"amplitude\", 100, 25),\n (\"speed max (cm/s)\", \"speed_average\", 100, 25),\n )\n):\n ax = fig.add_subplot(\n 2, 2, i + 1, xlabel=\"filtered grid\", ylabel=\"raw grid\", title=label\n )\n ax.plot(merge_f[field][i_] * factor, merge_r[field][j_] * factor, \".\")\n ax.set_aspect(\"equal\"), ax.grid()\n ax.plot((0, 1000), (0, 1000), \"r\")\n ax.set_xlim(0, stop), ax.set_ylim(0, stop)"
159+
"fig = plt.figure(figsize=(12, 12))\nfig.suptitle(f\"Scatter plot ({i_.shape[0]} matches)\")\n\nfor i, (label, field, factor, stop) in enumerate(\n (\n (\"speed radius (km)\", \"radius_s\", 0.001, 80),\n (\"outter radius (km)\", \"radius_e\", 0.001, 120),\n (\"amplitude (cm)\", \"amplitude\", 100, 25),\n (\"speed max (cm/s)\", \"speed_average\", 100, 25),\n )\n):\n ax = fig.add_subplot(\n 2, 2, i + 1, xlabel=\"filtered grid\", ylabel=\"raw grid\", title=label\n )\n ax.plot(merge_f[field][i_] * factor, merge_r[field][j_] * factor, \".\")\n ax.set_aspect(\"equal\"), ax.grid()\n ax.plot((0, 1000), (0, 1000), \"r\")\n ax.set_xlim(0, stop), ax.set_ylim(0, stop)"
160160
]
161161
}
162162
],

0 commit comments

Comments
 (0)