From d436ede8ca42935fbe551870a1300aeb4d61db29 Mon Sep 17 00:00:00 2001 From: AntSimi <36040805+AntSimi@users.noreply.github.com> Date: Tue, 30 Nov 2021 23:43:08 +0100 Subject: [PATCH 1/4] Add an example about loopers colocate with eddies --- .../12_external_data/pet_drifter_loopers.py | 136 ++++++++++++++++++ .../data/loopers_lumpkin_med.nc | Bin 0 -> 244130 bytes .../observations/observation.py | 3 +- src/py_eddy_tracker/observations/tracking.py | 8 +- src/py_eddy_tracker/poly.py | 20 +-- 5 files changed, 142 insertions(+), 25 deletions(-) create mode 100644 examples/12_external_data/pet_drifter_loopers.py create mode 100644 src/py_eddy_tracker/data/loopers_lumpkin_med.nc diff --git a/examples/12_external_data/pet_drifter_loopers.py b/examples/12_external_data/pet_drifter_loopers.py new file mode 100644 index 00000000..8cd7f54e --- /dev/null +++ b/examples/12_external_data/pet_drifter_loopers.py @@ -0,0 +1,136 @@ +""" +[draft] Loopers vs eddies from altimetry +======================================== + +All loopers datas used in this example are a subset from the dataset describe in this article +[Lumpkin, R. : Global characteristics of coherent vortices from surface drifter trajectories](https://doi.org/10.1002/2015JC011435) + + +""" + +import re + +import numpy as np +import py_eddy_tracker_sample +from IPython.display import HTML +from matplotlib import pyplot as plt +from matplotlib.animation import FuncAnimation + +from py_eddy_tracker import data +from py_eddy_tracker.appli.gui import Anim +from py_eddy_tracker.observations.tracking import TrackEddiesObservations + + +# %% +class VideoAnimation(FuncAnimation): + def _repr_html_(self, *args, **kwargs): + """To get video in html and have a player""" + content = self.to_html5_video() + return re.sub( + r'width="[0-9]*"\sheight="[0-9]*"', 'width="100%" height="100%"', content + ) + + def save(self, *args, **kwargs): + if args[0].endswith("gif"): + # In this case gif is use to create thumbnail which are not use but consume same time than video + # So we create an empty file, to save time + with open(args[0], "w") as _: + pass + return + return super().save(*args, **kwargs) + + +def start_axes(title): + fig = plt.figure(figsize=(13, 5)) + ax = fig.add_axes([0.03, 0.03, 0.90, 0.94], aspect="equal") + ax.set_xlim(-6, 36.5), ax.set_ylim(30, 46) + ax.set_title(title, weight="bold") + return ax + + +def update_axes(ax, mappable=None): + ax.grid() + if mappable: + plt.colorbar(mappable, cax=ax.figure.add_axes([0.94, 0.05, 0.01, 0.9])) + + +# %% +# Load eddies dataset +cyclonic_eddies = TrackEddiesObservations.load_file( + py_eddy_tracker_sample.get_demo_path("eddies_med_adt_allsat_dt2018/Cyclonic.zarr") +) +anticyclonic_eddies = TrackEddiesObservations.load_file( + py_eddy_tracker_sample.get_demo_path( + "eddies_med_adt_allsat_dt2018/Anticyclonic.zarr" + ) +) + +# %% +# Load loopers dataset +loopers_med = TrackEddiesObservations.load_file( + data.get_demo_path("loopers_lumpkin_med.nc") +) + +# %% +# +ax = start_axes("All drifter available in med from Lumpkin dataset") +loopers_med.plot(ax, lw=0.5, color="r", ref=-10) +update_axes(ax) + +# %% +# Only long period drifter +long_drifter = loopers_med.extract_with_length((400, -1)) +ax = start_axes("Long period drifter") +long_drifter.plot(ax, lw=0.5, color="r", ref=-10) +update_axes(ax) +print(np.unique(long_drifter.tracks)) + +# %% +drifter_1 = long_drifter.extract_ids((3588,)) +fig = plt.figure(figsize=(8, 4)) +ax = fig.add_subplot(111, aspect="equal") +ax.grid() +drifter_1.plot(ax, lw=0.5) +# %% +drifter_1.close_tracks( + anticyclonic_eddies, method="close_center", delta=0.5, nb_obs_min=25 +).tracks + +# %% +# Animation which show drifter with colocated eddies +ed = anticyclonic_eddies.extract_ids((4738, 4836, 4910,)) +x, y, t = drifter_1.lon, drifter_1.lat, drifter_1.time + + +def update(frame): + # We display last 5 days of loopers trajectory + m = (t < frame) * (t > (frame - 5)) + a.func_animation(frame) + line.set_data(x[m], y[m]) + + +a = Anim(ed, intern=True, figsize=(8, 8), cmap="magma_r", nb_step=10, dpi=60) +line = a.ax.plot([], [], "r", lw=4, zorder=100)[0] +kwargs = dict(frames=np.arange(*a.period, 1), interval=100) +a.fig.suptitle("") +_ = VideoAnimation(a.fig, update, **kwargs) + +# %% +fig = plt.figure(figsize=(12, 6)) +ax = fig.add_subplot(111) +ax.plot(drifter_1.time, drifter_1.radius_s / 1e3, label="loopers") +drifter_1.median_filter(7, "time", "radius_s", inplace=True) +drifter_1.loess_filter(15, "time", "radius_s", inplace=True) +ax.plot( + drifter_1.time, + drifter_1.radius_s / 1e3, + label="loopers (filtered half window 15 days)", +) +ax.plot(ed.time, ed.radius_s / 1e3, label="altimetry") +ed.median_filter(7, "time", "radius_s", inplace=True) +ed.loess_filter(15, "time", "radius_s", inplace=True) +ax.plot(ed.time, ed.radius_s / 1e3, label="altimetry (filtered half window 15 days)") +ax.set_ylabel("radius(km)"), ax.set_ylim(0, 100) +ax.legend() +ax.grid() +_ = ax.set_title("Radius from loopers and altimeter") diff --git a/src/py_eddy_tracker/data/loopers_lumpkin_med.nc b/src/py_eddy_tracker/data/loopers_lumpkin_med.nc new file mode 100644 index 0000000000000000000000000000000000000000..cf817424da673378c53f682e9ed781d6bd655d8c GIT binary patch literal 244130 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 H)A4@+r%wR= literal 0 HcmV?d00001 diff --git a/src/py_eddy_tracker/observations/observation.py b/src/py_eddy_tracker/observations/observation.py index dec9a6b0..56e0f67d 100644 --- a/src/py_eddy_tracker/observations/observation.py +++ b/src/py_eddy_tracker/observations/observation.py @@ -1987,7 +1987,7 @@ def display(self, ax, ref=None, extern_only=False, intern_only=False, **kwargs): """Plot the speed and effective (dashed) contour of the eddies :param matplotlib.axes.Axes ax: matplotlib axe used to draw - :param float,None ref: western longitude reference used + :param float,None ref: if defined, all coordinates are wrapped with ref as western boundary :param bool extern_only: if True, draw only the effective contour :param bool intern_only: if True, draw only the speed contour :param dict kwargs: look at :py:meth:`matplotlib.axes.Axes.plot` @@ -2082,7 +2082,6 @@ def inside(self, x, y, intern=False): :rtype: array[bool] """ xname, yname = self.intern(intern) - # FIXME: wrapping return insidepoly(x, y, self[xname], self[yname]) def grid_count(self, bins, intern=False, center=False, filter=slice(None)): diff --git a/src/py_eddy_tracker/observations/tracking.py b/src/py_eddy_tracker/observations/tracking.py index 3aa43387..09dd414b 100644 --- a/src/py_eddy_tracker/observations/tracking.py +++ b/src/py_eddy_tracker/observations/tracking.py @@ -445,6 +445,7 @@ def loess_filter(self, half_window, xfield, yfield, inplace=True): if inplace: self.obs[yfield] = result return self + return result def median_filter(self, half_window, xfield, yfield, inplace=True): result = track_median_filter( @@ -568,7 +569,7 @@ def close_tracks(self, other, nb_obs_min=10, **kwargs): """ p0, p1 = self.period indexs = list() - for i_self, i_other, t0, t1 in self.align_on(other, bins=range(p0, p1 + 2)): + for i_self, i_other, t0, t1 in self.align_on(other, bins=arange(p0, p1 + 2)): i, j, s = self.match(other, i_self=i_self, i_other=i_other, **kwargs) indexs.append(other.re_reference_index(j, i_other)) indexs = concatenate(indexs) @@ -578,10 +579,7 @@ def close_tracks(self, other, nb_obs_min=10, **kwargs): def format_label(self, label): t0, t1 = self.period return label.format( - t0=t0, - t1=t1, - nb_obs=len(self), - nb_tracks=(self.nb_obs_by_track != 0).sum(), + t0=t0, t1=t1, nb_obs=len(self), nb_tracks=(self.nb_obs_by_track != 0).sum(), ) def plot(self, ax, ref=None, **kwargs): diff --git a/src/py_eddy_tracker/poly.py b/src/py_eddy_tracker/poly.py index 56fb55e7..abe8becb 100644 --- a/src/py_eddy_tracker/poly.py +++ b/src/py_eddy_tracker/poly.py @@ -865,7 +865,7 @@ def poly_indexs(x_p, y_p, x_c, y_c): nb_p = x_p.shape[0] nb_c = x_c.shape[0] indexs = -ones(nb_p, dtype=numba_types.int32) - # Adress table to get particle bloc + # Adress table to get test bloc start_index, end_index, i_first = build_index(i[i_order]) nb_bloc = end_index.size for i_contour in range(nb_c): @@ -918,20 +918,4 @@ def insidepoly(x_p, y_p, x_c, y_c): :param array x_c: longitude of contours :param array y_c: latitude of contours """ - # TODO must be optimize like poly_index - nb_p = x_p.shape[0] - nb_c = x_c.shape[0] - flag = zeros(nb_p, dtype=numba_types.bool_) - for i in range(nb_c): - x_, y_ = reduce_size(x_c[i], y_c[i]) - x_c_min, y_c_min = x_.min(), y_.min() - x_c_max, y_c_max = x_.max(), y_.max() - v = create_vertice(x_, y_) - for j in range(nb_p): - if flag[j]: - continue - x, y = x_p[j], y_p[j] - if x > x_c_min and x < x_c_max and y > y_c_min and y < y_c_max: - if winding_number_poly(x, y, v) != 0: - flag[j] = True - return flag + return poly_indexs(x_p, y_p, x_c, y_c) != -1 From fc9ab7a1fb7a3ceeb33dc3e9c095bad395b37d45 Mon Sep 17 00:00:00 2001 From: AntSimi <36040805+AntSimi@users.noreply.github.com> Date: Tue, 30 Nov 2021 23:57:18 +0100 Subject: [PATCH 2/4] remove unused import --- examples/12_external_data/pet_drifter_loopers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/12_external_data/pet_drifter_loopers.py b/examples/12_external_data/pet_drifter_loopers.py index 8cd7f54e..d2f524ea 100644 --- a/examples/12_external_data/pet_drifter_loopers.py +++ b/examples/12_external_data/pet_drifter_loopers.py @@ -12,7 +12,6 @@ import numpy as np import py_eddy_tracker_sample -from IPython.display import HTML from matplotlib import pyplot as plt from matplotlib.animation import FuncAnimation From fa2d382730ae6babdd0ef418f24f4fa4f05b4bad Mon Sep 17 00:00:00 2001 From: AntSimi <36040805+AntSimi@users.noreply.github.com> Date: Mon, 6 Dec 2021 23:00:40 +0100 Subject: [PATCH 3/4] Add short example about loopers and eddies --- .../12_external_data/pet_drifter_loopers.py | 116 ++++++----- .../pet_drifter_loopers.ipynb | 191 ++++++++++++++++++ src/py_eddy_tracker/observations/network.py | 4 +- src/py_eddy_tracker/observations/tracking.py | 5 +- 4 files changed, 264 insertions(+), 52 deletions(-) create mode 100644 notebooks/python_module/12_external_data/pet_drifter_loopers.ipynb diff --git a/examples/12_external_data/pet_drifter_loopers.py b/examples/12_external_data/pet_drifter_loopers.py index d2f524ea..696a5346 100644 --- a/examples/12_external_data/pet_drifter_loopers.py +++ b/examples/12_external_data/pet_drifter_loopers.py @@ -1,11 +1,9 @@ """ -[draft] Loopers vs eddies from altimetry +Colocate looper with eddy from altimetry ======================================== -All loopers datas used in this example are a subset from the dataset describe in this article +All loopers data used in this example are a subset from the dataset describe in this article [Lumpkin, R. : Global characteristics of coherent vortices from surface drifter trajectories](https://doi.org/10.1002/2015JC011435) - - """ import re @@ -71,65 +69,85 @@ def update_axes(ax, mappable=None): ) # %% -# +# Global view +# =========== ax = start_axes("All drifter available in med from Lumpkin dataset") loopers_med.plot(ax, lw=0.5, color="r", ref=-10) update_axes(ax) # %% -# Only long period drifter -long_drifter = loopers_med.extract_with_length((400, -1)) -ax = start_axes("Long period drifter") -long_drifter.plot(ax, lw=0.5, color="r", ref=-10) -update_axes(ax) -print(np.unique(long_drifter.tracks)) - -# %% -drifter_1 = long_drifter.extract_ids((3588,)) -fig = plt.figure(figsize=(8, 4)) +# One segment of drifter +# ====================== +# +# Get a drifter segment (index used have no correspondance with original dataset). +looper = loopers_med.extract_ids((3588,)) +fig = plt.figure(figsize=(16, 6)) ax = fig.add_subplot(111, aspect="equal") +looper.plot(ax, lw=0.5, label="Original position of drifter") +looper_filtered = looper.copy() +looper_filtered.position_filter(1, 13) +s = looper_filtered.scatter( + ax, + "time", + cmap=plt.get_cmap("Spectral_r", 20), + label="Filtered position of drifter", +) +plt.colorbar(s).set_label("time (days from 1/1/1950)") +ax.legend() ax.grid() -drifter_1.plot(ax, lw=0.5) -# %% -drifter_1.close_tracks( - anticyclonic_eddies, method="close_center", delta=0.5, nb_obs_min=25 -).tracks # %% -# Animation which show drifter with colocated eddies -ed = anticyclonic_eddies.extract_ids((4738, 4836, 4910,)) -x, y, t = drifter_1.lon, drifter_1.lat, drifter_1.time - - -def update(frame): - # We display last 5 days of loopers trajectory - m = (t < frame) * (t > (frame - 5)) - a.func_animation(frame) - line.set_data(x[m], y[m]) - - -a = Anim(ed, intern=True, figsize=(8, 8), cmap="magma_r", nb_step=10, dpi=60) -line = a.ax.plot([], [], "r", lw=4, zorder=100)[0] -kwargs = dict(frames=np.arange(*a.period, 1), interval=100) -a.fig.suptitle("") -_ = VideoAnimation(a.fig, update, **kwargs) +# Try to find a detected eddies with adt at same place. We used filtered track to simulate an eddy center +match = looper_filtered.close_tracks( + anticyclonic_eddies, method="close_center", delta=0.1, nb_obs_min=50 +) +fig = plt.figure(figsize=(16, 6)) +ax = fig.add_subplot(111, aspect="equal") +looper.plot(ax, lw=0.5, label="Original position of drifter") +looper_filtered.plot(ax, lw=1.5, label="Filtered position of drifter") +match.plot(ax, lw=1.5, label="Matched eddy") +ax.legend() +ax.grid() # %% -fig = plt.figure(figsize=(12, 6)) +# Display radius of this 2 datasets. +fig = plt.figure(figsize=(20, 8)) ax = fig.add_subplot(111) -ax.plot(drifter_1.time, drifter_1.radius_s / 1e3, label="loopers") -drifter_1.median_filter(7, "time", "radius_s", inplace=True) -drifter_1.loess_filter(15, "time", "radius_s", inplace=True) +ax.plot(looper.time, looper.radius_s / 1e3, label="loopers") +looper_radius = looper.copy() +looper_radius.median_filter(1, "time", "radius_s", inplace=True) +looper_radius.loess_filter(13, "time", "radius_s", inplace=True) +ax.plot( + looper_radius.time, + looper_radius.radius_s / 1e3, + label="loopers (filtered half window 13 days)", +) +ax.plot(match.time, match.radius_s / 1e3, label="altimetry") +match_radius = match.copy() +match_radius.median_filter(1, "time", "radius_s", inplace=True) +match_radius.loess_filter(13, "time", "radius_s", inplace=True) ax.plot( - drifter_1.time, - drifter_1.radius_s / 1e3, - label="loopers (filtered half window 15 days)", + match_radius.time, + match_radius.radius_s / 1e3, + label="altimetry (filtered half window 13 days)", ) -ax.plot(ed.time, ed.radius_s / 1e3, label="altimetry") -ed.median_filter(7, "time", "radius_s", inplace=True) -ed.loess_filter(15, "time", "radius_s", inplace=True) -ax.plot(ed.time, ed.radius_s / 1e3, label="altimetry (filtered half window 15 days)") ax.set_ylabel("radius(km)"), ax.set_ylim(0, 100) ax.legend() +ax.set_title("Radius from loopers and altimeter") ax.grid() -_ = ax.set_title("Radius from loopers and altimeter") + + +# %% +# Animation which show drifter with colocated eddy +def update(frame): + # We display last 5 days of loopers trajectory + m = (looper.time < frame) * (looper.time > (frame - 5)) + anim.func_animation(frame) + line.set_data(looper.lon[m], looper.lat[m]) + + +anim = Anim(match, intern=True, figsize=(8, 8), cmap="magma_r", nb_step=10, dpi=75) +# mappable to show drifter in red +line = anim.ax.plot([], [], "r", lw=4, zorder=100)[0] +anim.fig.suptitle("") +_ = VideoAnimation(anim.fig, update, frames=np.arange(*anim.period, 1), interval=125) diff --git a/notebooks/python_module/12_external_data/pet_drifter_loopers.ipynb b/notebooks/python_module/12_external_data/pet_drifter_loopers.ipynb new file mode 100644 index 00000000..54af2d2b --- /dev/null +++ b/notebooks/python_module/12_external_data/pet_drifter_loopers.ipynb @@ -0,0 +1,191 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\nColocate looper with eddy from altimetry\n========================================\n\nAll loopers data used in this example are a subset from the dataset describe in this article\n[Lumpkin, R. : Global characteristics of coherent vortices from surface drifter trajectories](https://doi.org/10.1002/2015JC011435)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import re\n\nimport numpy as np\nimport py_eddy_tracker_sample\nfrom matplotlib import pyplot as plt\nfrom matplotlib.animation import FuncAnimation\n\nfrom py_eddy_tracker import data\nfrom py_eddy_tracker.appli.gui import Anim\nfrom py_eddy_tracker.observations.tracking import TrackEddiesObservations" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is use to create thumbnail which are not use but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)\n\n\ndef start_axes(title):\n fig = plt.figure(figsize=(13, 5))\n ax = fig.add_axes([0.03, 0.03, 0.90, 0.94], aspect=\"equal\")\n ax.set_xlim(-6, 36.5), ax.set_ylim(30, 46)\n ax.set_title(title, weight=\"bold\")\n return ax\n\n\ndef update_axes(ax, mappable=None):\n ax.grid()\n if mappable:\n plt.colorbar(mappable, cax=ax.figure.add_axes([0.94, 0.05, 0.01, 0.9]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load eddies dataset\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "cyclonic_eddies = TrackEddiesObservations.load_file(\n py_eddy_tracker_sample.get_demo_path(\"eddies_med_adt_allsat_dt2018/Cyclonic.zarr\")\n)\nanticyclonic_eddies = TrackEddiesObservations.load_file(\n py_eddy_tracker_sample.get_demo_path(\n \"eddies_med_adt_allsat_dt2018/Anticyclonic.zarr\"\n )\n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load loopers dataset\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "loopers_med = TrackEddiesObservations.load_file(\n data.get_demo_path(\"loopers_lumpkin_med.nc\")\n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Global view\n===========\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ax = start_axes(\"All drifter available in med from Lumpkin dataset\")\nloopers_med.plot(ax, lw=0.5, color=\"r\", ref=-10)\nupdate_axes(ax)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One segment of drifter\n======================\n\nGet a drifter segment (index used have no correspondance with original dataset).\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "looper = loopers_med.extract_ids((3588,))\nfig = plt.figure(figsize=(16, 6))\nax = fig.add_subplot(111, aspect=\"equal\")\nlooper.plot(ax, lw=0.5, label=\"Original position of drifter\")\nlooper_filtered = looper.copy()\nlooper_filtered.position_filter(1, 13)\ns = looper_filtered.scatter(\n ax,\n \"time\",\n cmap=plt.get_cmap(\"Spectral_r\", 20),\n label=\"Filtered position of drifter\",\n)\nplt.colorbar(s).set_label(\"time (days from 1/1/1950)\")\nax.legend()\nax.grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Try to find a detected eddies with adt at same place. We used filtered track to simulate an eddy center\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "match = looper_filtered.close_tracks(\n anticyclonic_eddies, method=\"close_center\", delta=0.1, nb_obs_min=50\n)\nfig = plt.figure(figsize=(16, 6))\nax = fig.add_subplot(111, aspect=\"equal\")\nlooper.plot(ax, lw=0.5, label=\"Original position of drifter\")\nlooper_filtered.plot(ax, lw=1.5, label=\"Filtered position of drifter\")\nmatch.plot(ax, lw=1.5, label=\"Matched eddy\")\nax.legend()\nax.grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Display radius of this 2 datasets.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig = plt.figure(figsize=(20, 8))\nax = fig.add_subplot(111)\nax.plot(looper.time, looper.radius_s / 1e3, label=\"loopers\")\nlooper_radius = looper.copy()\nlooper_radius.median_filter(1, \"time\", \"radius_s\", inplace=True)\nlooper_radius.loess_filter(13, \"time\", \"radius_s\", inplace=True)\nax.plot(\n looper_radius.time,\n looper_radius.radius_s / 1e3,\n label=\"loopers (filtered half window 13 days)\",\n)\nax.plot(match.time, match.radius_s / 1e3, label=\"altimetry\")\nmatch_radius = match.copy()\nmatch_radius.median_filter(1, \"time\", \"radius_s\", inplace=True)\nmatch_radius.loess_filter(13, \"time\", \"radius_s\", inplace=True)\nax.plot(\n match_radius.time,\n match_radius.radius_s / 1e3,\n label=\"altimetry (filtered half window 13 days)\",\n)\nax.set_ylabel(\"radius(km)\"), ax.set_ylim(0, 100)\nax.legend()\nax.set_title(\"Radius from loopers and altimeter\")\nax.grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Animation which show drifter with colocated eddy\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def update(frame):\n # We display last 5 days of loopers trajectory\n m = (looper.time < frame) * (looper.time > (frame - 5))\n anim.func_animation(frame)\n line.set_data(looper.lon[m], looper.lat[m])\n\n\nanim = Anim(match, intern=True, figsize=(8, 8), cmap=\"magma_r\", nb_step=10, dpi=75)\n# mappable to show drifter in red\nline = anim.ax.plot([], [], \"r\", lw=4, zorder=100)[0]\nanim.fig.suptitle(\"\")\n_ = VideoAnimation(anim.fig, update, frames=np.arange(*anim.period, 1), interval=125)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/src/py_eddy_tracker/observations/network.py b/src/py_eddy_tracker/observations/network.py index 90bf6b70..8f592056 100644 --- a/src/py_eddy_tracker/observations/network.py +++ b/src/py_eddy_tracker/observations/network.py @@ -1327,7 +1327,7 @@ def extract_light_with_mask(self, mask): ) new.sign_type = self.sign_type if nb_obs == 0: - logger.warning("Empty dataset will be created") + logger.info("Empty dataset will be created") else: logger.info( f"{nb_obs} observations will be extracted ({nb_obs / self.shape[0]:.3%})" @@ -1353,7 +1353,7 @@ def extract_with_mask(self, mask): new = self.__class__.new_like(self, nb_obs) new.sign_type = self.sign_type if nb_obs == 0: - logger.warning("Empty dataset will be created") + logger.info("Empty dataset will be created") else: logger.debug( f"{nb_obs} observations will be extracted ({nb_obs / self.shape[0]:.3%})" diff --git a/src/py_eddy_tracker/observations/tracking.py b/src/py_eddy_tracker/observations/tracking.py index 09dd414b..2914df6b 100644 --- a/src/py_eddy_tracker/observations/tracking.py +++ b/src/py_eddy_tracker/observations/tracking.py @@ -502,7 +502,7 @@ def extract_with_mask( new = self.__class__.new_like(self, nb_obs) new.sign_type = self.sign_type if nb_obs == 0: - logger.warning("Empty dataset will be created") + logger.info("Empty dataset will be created") else: for field in self.obs.dtype.descr: logger.debug("Copy of field %s ...", field) @@ -568,6 +568,9 @@ def close_tracks(self, other, nb_obs_min=10, **kwargs): It could be a costly operation for huge dataset """ p0, p1 = self.period + p0_other, p1_other = other.period + if p1_other < p0 or p1 < p0_other: + return other.__class__.new_like(other, 0) indexs = list() for i_self, i_other, t0, t1 in self.align_on(other, bins=arange(p0, p1 + 2)): i, j, s = self.match(other, i_self=i_self, i_other=i_other, **kwargs) From 9e9b90d6f67df93829d82675d90709dbfae82baa Mon Sep 17 00:00:00 2001 From: AntSimi <36040805+AntSimi@users.noreply.github.com> Date: Tue, 7 Dec 2021 21:15:23 +0100 Subject: [PATCH 4/4] - english correction - refactoring --- CHANGELOG.rst | 2 ++ examples/06_grid_manipulation/pet_advect.py | 2 +- examples/06_grid_manipulation/pet_lavd.py | 8 ++----- examples/07_cube_manipulation/pet_cube.py | 2 +- .../pet_track_anim_matplotlib_animation.py | 2 +- .../pet_normalised_lifetime.py | 18 +++++++-------- .../12_external_data/pet_drifter_loopers.py | 10 ++++----- examples/16_network/pet_follow_particle.py | 2 +- examples/16_network/pet_group_anim.py | 2 +- examples/16_network/pet_ioannou_2017_case.py | 2 +- examples/16_network/pet_segmentation_anim.py | 5 ++--- .../06_grid_manipulation/pet_advect.ipynb | 18 +++++++-------- .../06_grid_manipulation/pet_lavd.ipynb | 20 ++++++++--------- .../07_cube_manipulation/pet_cube.ipynb | 14 ++++++------ .../pet_track_anim_matplotlib_animation.ipynb | 4 ++-- .../pet_normalised_lifetime.ipynb | 12 +++++----- .../pet_drifter_loopers.ipynb | 10 ++++----- .../16_network/pet_follow_particle.ipynb | 8 +++---- .../16_network/pet_group_anim.ipynb | 10 ++++----- .../16_network/pet_ioannou_2017_case.ipynb | 22 +++++++++---------- .../16_network/pet_segmentation_anim.ipynb | 2 +- 21 files changed, 86 insertions(+), 89 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 75cc2dd0..c6ab4cac 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -21,11 +21,13 @@ Fixed - Fix bug in convolution(filter), lowest rows was replace by zeros in convolution computation. Important impact for tiny kernel +- Fix method of sampling before contour fitting Added ^^^^^ - Allow to replace mask by isnan method to manage nan data instead of masked data +- Add drifter colocation example [3.5.0] - 2021-06-22 -------------------- diff --git a/examples/06_grid_manipulation/pet_advect.py b/examples/06_grid_manipulation/pet_advect.py index 0e00697f..1a98536a 100644 --- a/examples/06_grid_manipulation/pet_advect.py +++ b/examples/06_grid_manipulation/pet_advect.py @@ -50,7 +50,7 @@ def _repr_html_(self, *args, **kwargs): def save(self, *args, **kwargs): if args[0].endswith("gif"): - # In this case gif is use to create thumbnail which are not use but consume same time than video + # In this case gif is used to create thumbnail which is not used but consume same time than video # So we create an empty file, to save time with open(args[0], "w") as _: pass diff --git a/examples/06_grid_manipulation/pet_lavd.py b/examples/06_grid_manipulation/pet_lavd.py index e597821c..89d64108 100644 --- a/examples/06_grid_manipulation/pet_lavd.py +++ b/examples/06_grid_manipulation/pet_lavd.py @@ -65,7 +65,7 @@ def _repr_html_(self, *args, **kwargs): def save(self, *args, **kwargs): if args[0].endswith("gif"): - # In this case gif is use to create thumbnail which are not use but consume same time than video + # In this case gif is used to create thumbnail which is not used but consume same time than video # So we create an empty file, to save time with open(args[0], "w") as _: pass @@ -159,11 +159,7 @@ def update(i_frame): # Format LAVD data lavd = RegularGridDataset.with_array( coordinates=("lon", "lat"), - datas=dict( - lavd=lavd.T, - lon=x_g, - lat=y_g, - ), + datas=dict(lavd=lavd.T, lon=x_g, lat=y_g,), centered=True, ) diff --git a/examples/07_cube_manipulation/pet_cube.py b/examples/07_cube_manipulation/pet_cube.py index a674359d..7f30c4e1 100644 --- a/examples/07_cube_manipulation/pet_cube.py +++ b/examples/07_cube_manipulation/pet_cube.py @@ -31,7 +31,7 @@ def _repr_html_(self, *args, **kwargs): def save(self, *args, **kwargs): if args[0].endswith("gif"): - # In this case gif is use to create thumbnail which are not use but consume same time than video + # In this case gif is used to create thumbnail which is not used but consume same time than video # So we create an empty file, to save time with open(args[0], "w") as _: pass diff --git a/examples/08_tracking_manipulation/pet_track_anim_matplotlib_animation.py b/examples/08_tracking_manipulation/pet_track_anim_matplotlib_animation.py index 59b21527..81e57e59 100644 --- a/examples/08_tracking_manipulation/pet_track_anim_matplotlib_animation.py +++ b/examples/08_tracking_manipulation/pet_track_anim_matplotlib_animation.py @@ -30,7 +30,7 @@ def _repr_html_(self, *args, **kwargs): def save(self, *args, **kwargs): if args[0].endswith("gif"): - # In this case gif is use to create thumbnail which are not use but consume same time than video + # In this case gif is used to create thumbnail which is not used but consume same time than video # So we create an empty file, to save time with open(args[0], "w") as _: pass diff --git a/examples/10_tracking_diagnostics/pet_normalised_lifetime.py b/examples/10_tracking_diagnostics/pet_normalised_lifetime.py index 73e5274e..1c84a8cc 100644 --- a/examples/10_tracking_diagnostics/pet_normalised_lifetime.py +++ b/examples/10_tracking_diagnostics/pet_normalised_lifetime.py @@ -65,14 +65,14 @@ def eddy_norm_lifetime(self, name, nb, factor=1): # %% # Figure # ------ -fig, axs = plt.subplots(nrows=2, figsize=(8, 6)) +fig, (ax0, ax1) = plt.subplots(nrows=2, figsize=(8, 6)) -axs[0].set_title("Normalised Mean Radius") -axs[0].plot(*AC_radius), axs[0].plot(*CC_radius) -axs[0].set_ylabel("Radius (km)"), axs[0].grid() -axs[0].set_xlim(0, 1), axs[0].set_ylim(0, None) +ax0.set_title("Normalised Mean Radius") +ax0.plot(*AC_radius), ax0.plot(*CC_radius) +ax0.set_ylabel("Radius (km)"), ax0.grid() +ax0.set_xlim(0, 1), ax0.set_ylim(0, None) -axs[1].set_title("Normalised Mean Amplitude") -axs[1].plot(*AC_amplitude, label="AC"), axs[1].plot(*CC_amplitude, label="CC") -axs[1].set_ylabel("Amplitude (cm)"), axs[1].grid(), axs[1].legend() -_ = axs[1].set_xlim(0, 1), axs[1].set_ylim(0, None) +ax1.set_title("Normalised Mean Amplitude") +ax1.plot(*AC_amplitude, label="AC"), ax1.plot(*CC_amplitude, label="CC") +ax1.set_ylabel("Amplitude (cm)"), ax1.grid(), ax1.legend() +_ = ax1.set_xlim(0, 1), ax1.set_ylim(0, None) diff --git a/examples/12_external_data/pet_drifter_loopers.py b/examples/12_external_data/pet_drifter_loopers.py index 696a5346..92707906 100644 --- a/examples/12_external_data/pet_drifter_loopers.py +++ b/examples/12_external_data/pet_drifter_loopers.py @@ -2,7 +2,7 @@ Colocate looper with eddy from altimetry ======================================== -All loopers data used in this example are a subset from the dataset describe in this article +All loopers data used in this example are a subset from the dataset described in this article [Lumpkin, R. : Global characteristics of coherent vortices from surface drifter trajectories](https://doi.org/10.1002/2015JC011435) """ @@ -29,7 +29,7 @@ def _repr_html_(self, *args, **kwargs): def save(self, *args, **kwargs): if args[0].endswith("gif"): - # In this case gif is use to create thumbnail which are not use but consume same time than video + # In this case gif is used to create thumbnail which is not used but consume same time than video # So we create an empty file, to save time with open(args[0], "w") as _: pass @@ -71,7 +71,7 @@ def update_axes(ax, mappable=None): # %% # Global view # =========== -ax = start_axes("All drifter available in med from Lumpkin dataset") +ax = start_axes("All drifters available in Med from Lumpkin dataset") loopers_med.plot(ax, lw=0.5, color="r", ref=-10) update_axes(ax) @@ -79,7 +79,7 @@ def update_axes(ax, mappable=None): # One segment of drifter # ====================== # -# Get a drifter segment (index used have no correspondance with original dataset). +# Get a drifter segment (the indexes used have no correspondance with the original dataset). looper = loopers_med.extract_ids((3588,)) fig = plt.figure(figsize=(16, 6)) ax = fig.add_subplot(111, aspect="equal") @@ -138,7 +138,7 @@ def update_axes(ax, mappable=None): # %% -# Animation which show drifter with colocated eddy +# Animation of a drifter and its colocated eddy def update(frame): # We display last 5 days of loopers trajectory m = (looper.time < frame) * (looper.time > (frame - 5)) diff --git a/examples/16_network/pet_follow_particle.py b/examples/16_network/pet_follow_particle.py index 1c858879..dbe0753e 100644 --- a/examples/16_network/pet_follow_particle.py +++ b/examples/16_network/pet_follow_particle.py @@ -31,7 +31,7 @@ def _repr_html_(self, *args, **kwargs): def save(self, *args, **kwargs): if args[0].endswith("gif"): - # In this case gif is used to create thumbnail which are not used but consumes same time than video + # In this case gif is used to create thumbnail which is not used but consume same time than video # So we create an empty file, to save time with open(args[0], "w") as _: pass diff --git a/examples/16_network/pet_group_anim.py b/examples/16_network/pet_group_anim.py index 8ecee534..047f5820 100644 --- a/examples/16_network/pet_group_anim.py +++ b/examples/16_network/pet_group_anim.py @@ -29,7 +29,7 @@ def _repr_html_(self, *args, **kwargs): def save(self, *args, **kwargs): if args[0].endswith("gif"): - # In this case gif is use to create thumbnail which are not use but consume same time than video + # In this case gif is used to create thumbnail which is not used but consume same time than video # So we create an empty file, to save time with open(args[0], "w") as _: pass diff --git a/examples/16_network/pet_ioannou_2017_case.py b/examples/16_network/pet_ioannou_2017_case.py index bbe26e3f..b02b846a 100644 --- a/examples/16_network/pet_ioannou_2017_case.py +++ b/examples/16_network/pet_ioannou_2017_case.py @@ -36,7 +36,7 @@ def _repr_html_(self, *args, **kwargs): def save(self, *args, **kwargs): if args[0].endswith("gif"): - # In this case gif is use to create thumbnail which are not use but consume same time than video + # In this case gif is used to create thumbnail which is not used but consume same time than video # So we create an empty file, to save time with open(args[0], "w") as _: pass diff --git a/examples/16_network/pet_segmentation_anim.py b/examples/16_network/pet_segmentation_anim.py index 340163a1..58f71188 100644 --- a/examples/16_network/pet_segmentation_anim.py +++ b/examples/16_network/pet_segmentation_anim.py @@ -27,7 +27,7 @@ def _repr_html_(self, *args, **kwargs): def save(self, *args, **kwargs): if args[0].endswith("gif"): - # In this case gif is use to create thumbnail which are not use but consume same time than video + # In this case gif is used to create thumbnail which is not used but consume same time than video # So we create an empty file, to save time with open(args[0], "w") as _: pass @@ -96,8 +96,7 @@ def update(i_frame): indices_frames = INDICES[i_frame] mappable_CONTOUR.set_data( - e.contour_lon_e[indices_frames], - e.contour_lat_e[indices_frames], + e.contour_lon_e[indices_frames], e.contour_lat_e[indices_frames], ) mappable_CONTOUR.set_color(cmap.colors[tr[indices_frames] % len(cmap.colors)]) return (mappable_tracks,) diff --git a/notebooks/python_module/06_grid_manipulation/pet_advect.ipynb b/notebooks/python_module/06_grid_manipulation/pet_advect.ipynb index bceed074..79d69b0d 100644 --- a/notebooks/python_module/06_grid_manipulation/pet_advect.ipynb +++ b/notebooks/python_module/06_grid_manipulation/pet_advect.ipynb @@ -15,7 +15,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n# Grid advection\n\nDummy advection which use only static geostrophic current, which didn't solve the complex circulation of the ocean.\n" + "\nGrid advection\n==============\n\nDummy advection which use only static geostrophic current, which didn't solve the complex circulation of the ocean.\n" ] }, { @@ -91,14 +91,14 @@ }, "outputs": [], "source": [ - "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is use to create thumbnail which are not use but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)" + "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is used to create thumbnail which is not used but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Anim\nParticles setup\n\n" + "Anim\n----\nParticles setup\n\n" ] }, { @@ -152,7 +152,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Filament forward\nDraw 3 last position in one path for each particles.,\nit could be run backward with `backward=True` option in filament method\n\n" + "Filament forward\n^^^^^^^^^^^^^^^^\nDraw 3 last position in one path for each particles.,\nit could be run backward with `backward=True` option in filament method\n\n" ] }, { @@ -170,7 +170,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Particle forward\nForward advection of particles\n\n" + "Particle forward\n^^^^^^^^^^^^^^^^^\nForward advection of particles\n\n" ] }, { @@ -206,14 +206,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Particles stat\n\n" + "Particles stat\n--------------\n\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Time_step settings\nDummy experiment to test advection precision, we run particles 50 days forward and backward with different time step\nand we measure distance between new positions and original positions.\n\n" + "Time_step settings\n^^^^^^^^^^^^^^^^^^\nDummy experiment to test advection precision, we run particles 50 days forward and backward with different time step\nand we measure distance between new positions and original positions.\n\n" ] }, { @@ -231,7 +231,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Time duration\nWe keep same time_step but change time duration\n\n" + "Time duration\n^^^^^^^^^^^^^\nWe keep same time_step but change time duration\n\n" ] }, { @@ -262,7 +262,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.7" } }, "nbformat": 4, diff --git a/notebooks/python_module/06_grid_manipulation/pet_lavd.ipynb b/notebooks/python_module/06_grid_manipulation/pet_lavd.ipynb index a5ca088c..c4a4da84 100644 --- a/notebooks/python_module/06_grid_manipulation/pet_lavd.ipynb +++ b/notebooks/python_module/06_grid_manipulation/pet_lavd.ipynb @@ -15,7 +15,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n# LAVD experiment\n\nNaive method to reproduce LAVD(Lagrangian-Averaged Vorticity deviation) method with a static velocity field.\nIn the current example we didn't remove a mean vorticity.\n\nMethod are described here:\n\n - Abernathey, Ryan, and George Haller. \"Transport by Lagrangian Vortices in the Eastern Pacific\",\n Journal of Physical Oceanography 48, 3 (2018): 667-685, accessed Feb 16, 2021,\n https://doi.org/10.1175/JPO-D-17-0102.1\n - `Transport by Coherent Lagrangian Vortices`_,\n R. Abernathey, Sinha A., Tarshish N., Liu T., Zhang C., Haller G., 2019,\n Talk a t the Sources and Sinks of Ocean Mesoscale Eddy Energy CLIVAR Workshop\n\n https://usclivar.org/sites/default/files/meetings/2019/presentations/Aberernathey_CLIVAR.pdf\n" + "\nLAVD experiment\n===============\n\nNaive method to reproduce LAVD(Lagrangian-Averaged Vorticity deviation) method with a static velocity field.\nIn the current example we didn't remove a mean vorticity.\n\nMethod are described here:\n\n - Abernathey, Ryan, and George Haller. \"Transport by Lagrangian Vortices in the Eastern Pacific\",\n Journal of Physical Oceanography 48, 3 (2018): 667-685, accessed Feb 16, 2021,\n https://doi.org/10.1175/JPO-D-17-0102.1\n - `Transport by Coherent Lagrangian Vortices`_,\n R. Abernathey, Sinha A., Tarshish N., Liu T., Zhang C., Haller G., 2019,\n Talk a t the Sources and Sinks of Ocean Mesoscale Eddy Energy CLIVAR Workshop\n\n https://usclivar.org/sites/default/files/meetings/2019/presentations/Aberernathey_CLIVAR.pdf\n" ] }, { @@ -48,14 +48,14 @@ }, "outputs": [], "source": [ - "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is use to create thumbnail which are not use but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)" + "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is used to create thumbnail which is not used but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Data\nTo compute vorticity ($\\omega$) we compute u/v field with a stencil and apply the following equation with stencil\nmethod :\n\n\\begin{align}\\omega = \\frac{\\partial v}{\\partial x} - \\frac{\\partial u}{\\partial y}\\end{align}\n\n" + "Data\n----\nTo compute vorticity ($\\omega$) we compute u/v field with a stencil and apply the following equation with stencil\nmethod :\n\n\\begin{align}\\omega = \\frac{\\partial v}{\\partial x} - \\frac{\\partial u}{\\partial y}\\end{align}\n\n" ] }, { @@ -91,7 +91,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Particles\nParticles specification\n\n" + "Particles\n---------\nParticles specification\n\n" ] }, { @@ -109,7 +109,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## LAVD\n\n" + "LAVD\n----\n\n" ] }, { @@ -127,7 +127,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Anim\nMovie of LAVD integration at each integration time step.\n\n" + "Anim\n^^^^\nMovie of LAVD integration at each integration time step.\n\n" ] }, { @@ -138,14 +138,14 @@ }, "outputs": [], "source": [ - "def update(i_frame):\n global lavd, i\n i += 1\n x, y = particule.__next__()\n # Interp vorticity on new_position\n lavd += abs(g.interp(\"vort\", x, y).reshape(original_shape) * 1 / nb_time)\n txt.set_text(f\"T0 + {i / step_by_day:.2f} days of advection\")\n pcolormesh.set_array(lavd / i * nb_time)\n return pcolormesh, txt\n\n\nkw_video = dict(frames=arange(nb_time), interval=1000.0 / step_by_day / 2, blit=True)\nfig, ax, txt = start_ax(dpi=60)\nx_g_, y_g_ = arange(0 - step / 2, 36 + step / 2, step), arange(\n 28 - step / 2, 46 + step / 2, step\n)\n# pcolorfast will be faster than pcolormesh, we could use pcolorfast due to x and y are regular\npcolormesh = ax.pcolorfast(x_g_, y_g_, lavd, **kw_vorticity)\nupdate_axes(ax, pcolormesh)\n_ = VideoAnimation(ax.figure, update, **kw_video)" + "def update(i_frame):\n global lavd, i\n i += 1\n x, y = particule.__next__()\n # Interp vorticity on new_position\n lavd += abs(g.interp(\"vort\", x, y).reshape(original_shape) * 1 / nb_time)\n txt.set_text(f\"T0 + {i / step_by_day:.2f} days of advection\")\n pcolormesh.set_array(lavd / i * nb_time)\n return pcolormesh, txt\n\n\nkw_video = dict(frames=arange(nb_time), interval=1000.0 / step_by_day / 2, blit=True)\nfig, ax, txt = start_ax(dpi=60)\nx_g_, y_g_ = (\n arange(0 - step / 2, 36 + step / 2, step),\n arange(28 - step / 2, 46 + step / 2, step),\n)\n# pcolorfast will be faster than pcolormesh, we could use pcolorfast due to x and y are regular\npcolormesh = ax.pcolorfast(x_g_, y_g_, lavd, **kw_vorticity)\nupdate_axes(ax, pcolormesh)\n_ = VideoAnimation(ax.figure, update, **kw_video)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Final LAVD\n\n" + "Final LAVD\n^^^^^^^^^^\n\n" ] }, { @@ -163,7 +163,7 @@ }, "outputs": [], "source": [ - "lavd = RegularGridDataset.with_array(\n coordinates=(\"lon\", \"lat\"),\n datas=dict(\n lavd=lavd.T,\n lon=x_g,\n lat=y_g,\n ),\n centered=True,\n)" + "lavd = RegularGridDataset.with_array(\n coordinates=(\"lon\", \"lat\"),\n datas=dict(lavd=lavd.T, lon=x_g, lat=y_g,),\n centered=True,\n)" ] }, { @@ -201,7 +201,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.7" } }, "nbformat": 4, diff --git a/notebooks/python_module/07_cube_manipulation/pet_cube.ipynb b/notebooks/python_module/07_cube_manipulation/pet_cube.ipynb index 22cf3158..d4cdb187 100644 --- a/notebooks/python_module/07_cube_manipulation/pet_cube.ipynb +++ b/notebooks/python_module/07_cube_manipulation/pet_cube.ipynb @@ -15,7 +15,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n# Time advection\n\nExample which use CMEMS surface current with a Runge-Kutta 4 algorithm to advect particles.\n" + "\nTime advection\n==============\n\nExample which use CMEMS surface current with a Runge-Kutta 4 algorithm to advect particles.\n" ] }, { @@ -37,14 +37,14 @@ }, "outputs": [], "source": [ - "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is use to create thumbnail which are not use but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)" + "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is used to create thumbnail which is not used but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Data\nLoad Input time grid ADT\n\n" + "Data\n----\nLoad Input time grid ADT\n\n" ] }, { @@ -62,7 +62,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Anim\nParticles setup\n\n" + "Anim\n----\nParticles setup\n\n" ] }, { @@ -109,7 +109,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Particules stat\nTime_step settings\n^^^^^^^^^^^^^^^^^^\nDummy experiment to test advection precision, we run particles 50 days forward and backward with different time step\nand we measure distance between new positions and original positions.\n\n" + "Particules stat\n---------------\nTime_step settings\n^^^^^^^^^^^^^^^^^^\nDummy experiment to test advection precision, we run particles 50 days forward and backward with different time step\nand we measure distance between new positions and original positions.\n\n" ] }, { @@ -127,7 +127,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Time duration\nWe keep same time_step but change time duration\n\n" + "Time duration\n^^^^^^^^^^^^^\nWe keep same time_step but change time duration\n\n" ] }, { @@ -158,7 +158,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.7" } }, "nbformat": 4, diff --git a/notebooks/python_module/08_tracking_manipulation/pet_track_anim_matplotlib_animation.ipynb b/notebooks/python_module/08_tracking_manipulation/pet_track_anim_matplotlib_animation.ipynb index bcd4ba74..1fc4d082 100644 --- a/notebooks/python_module/08_tracking_manipulation/pet_track_anim_matplotlib_animation.ipynb +++ b/notebooks/python_module/08_tracking_manipulation/pet_track_anim_matplotlib_animation.ipynb @@ -37,7 +37,7 @@ }, "outputs": [], "source": [ - "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is use to create thumbnail which are not use but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)" + "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is used to create thumbnail which is not used but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)" ] }, { @@ -98,4 +98,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} \ No newline at end of file +} diff --git a/notebooks/python_module/10_tracking_diagnostics/pet_normalised_lifetime.ipynb b/notebooks/python_module/10_tracking_diagnostics/pet_normalised_lifetime.ipynb index a53f2d3a..f9fb474f 100644 --- a/notebooks/python_module/10_tracking_diagnostics/pet_normalised_lifetime.ipynb +++ b/notebooks/python_module/10_tracking_diagnostics/pet_normalised_lifetime.ipynb @@ -15,7 +15,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n# Normalised Eddy Lifetimes\n\nExample from Evan Mason\n" + "\nNormalised Eddy Lifetimes\n=========================\n\nExample from Evan Mason\n" ] }, { @@ -44,7 +44,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Load atlas\n\n" + "Load atlas\n----------\n\n" ] }, { @@ -62,7 +62,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Compute normalised lifetime\n\n" + "Compute normalised lifetime\n---------------------------\n\n" ] }, { @@ -80,7 +80,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Figure\n\n" + "Figure\n------\n\n" ] }, { @@ -91,7 +91,7 @@ }, "outputs": [], "source": [ - "fig, axs = plt.subplots(nrows=2, figsize=(8, 6))\n\naxs[0].set_title(\"Normalised Mean Radius\")\naxs[0].plot(*AC_radius), axs[0].plot(*CC_radius)\naxs[0].set_ylabel(\"Radius (km)\"), axs[0].grid()\naxs[0].set_xlim(0, 1), axs[0].set_ylim(0, None)\n\naxs[1].set_title(\"Normalised Mean Amplitude\")\naxs[1].plot(*AC_amplitude, label=\"AC\"), axs[1].plot(*CC_amplitude, label=\"CC\")\naxs[1].set_ylabel(\"Amplitude (cm)\"), axs[1].grid(), axs[1].legend()\n_ = axs[1].set_xlim(0, 1), axs[1].set_ylim(0, None)" + "fig, (ax0, ax1) = plt.subplots(nrows=2, figsize=(8, 6))\n\nax0.set_title(\"Normalised Mean Radius\")\nax0.plot(*AC_radius), ax0.plot(*CC_radius)\nax0.set_ylabel(\"Radius (km)\"), ax0.grid()\nax0.set_xlim(0, 1), ax0.set_ylim(0, None)\n\nax1.set_title(\"Normalised Mean Amplitude\")\nax1.plot(*AC_amplitude, label=\"AC\"), ax1.plot(*CC_amplitude, label=\"CC\")\nax1.set_ylabel(\"Amplitude (cm)\"), ax1.grid(), ax1.legend()\n_ = ax1.set_xlim(0, 1), ax1.set_ylim(0, None)" ] } ], @@ -111,7 +111,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.7" } }, "nbformat": 4, diff --git a/notebooks/python_module/12_external_data/pet_drifter_loopers.ipynb b/notebooks/python_module/12_external_data/pet_drifter_loopers.ipynb index 54af2d2b..7ba30914 100644 --- a/notebooks/python_module/12_external_data/pet_drifter_loopers.ipynb +++ b/notebooks/python_module/12_external_data/pet_drifter_loopers.ipynb @@ -15,7 +15,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\nColocate looper with eddy from altimetry\n========================================\n\nAll loopers data used in this example are a subset from the dataset describe in this article\n[Lumpkin, R. : Global characteristics of coherent vortices from surface drifter trajectories](https://doi.org/10.1002/2015JC011435)\n" + "\nColocate looper with eddy from altimetry\n========================================\n\nAll loopers data used in this example are a subset from the dataset described in this article\n[Lumpkin, R. : Global characteristics of coherent vortices from surface drifter trajectories](https://doi.org/10.1002/2015JC011435)\n" ] }, { @@ -37,7 +37,7 @@ }, "outputs": [], "source": [ - "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is use to create thumbnail which are not use but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)\n\n\ndef start_axes(title):\n fig = plt.figure(figsize=(13, 5))\n ax = fig.add_axes([0.03, 0.03, 0.90, 0.94], aspect=\"equal\")\n ax.set_xlim(-6, 36.5), ax.set_ylim(30, 46)\n ax.set_title(title, weight=\"bold\")\n return ax\n\n\ndef update_axes(ax, mappable=None):\n ax.grid()\n if mappable:\n plt.colorbar(mappable, cax=ax.figure.add_axes([0.94, 0.05, 0.01, 0.9]))" + "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is used to create thumbnail which is not used but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)\n\n\ndef start_axes(title):\n fig = plt.figure(figsize=(13, 5))\n ax = fig.add_axes([0.03, 0.03, 0.90, 0.94], aspect=\"equal\")\n ax.set_xlim(-6, 36.5), ax.set_ylim(30, 46)\n ax.set_title(title, weight=\"bold\")\n return ax\n\n\ndef update_axes(ax, mappable=None):\n ax.grid()\n if mappable:\n plt.colorbar(mappable, cax=ax.figure.add_axes([0.94, 0.05, 0.01, 0.9]))" ] }, { @@ -91,14 +91,14 @@ }, "outputs": [], "source": [ - "ax = start_axes(\"All drifter available in med from Lumpkin dataset\")\nloopers_med.plot(ax, lw=0.5, color=\"r\", ref=-10)\nupdate_axes(ax)" + "ax = start_axes(\"All drifters available in Med from Lumpkin dataset\")\nloopers_med.plot(ax, lw=0.5, color=\"r\", ref=-10)\nupdate_axes(ax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "One segment of drifter\n======================\n\nGet a drifter segment (index used have no correspondance with original dataset).\n\n" + "One segment of drifter\n======================\n\nGet a drifter segment (the indexes used have no correspondance with the original dataset).\n\n" ] }, { @@ -152,7 +152,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Animation which show drifter with colocated eddy\n\n" + "Animation of a drifter and its colocated eddy\n\n" ] }, { diff --git a/notebooks/python_module/16_network/pet_follow_particle.ipynb b/notebooks/python_module/16_network/pet_follow_particle.ipynb index 15820ad3..a2a97944 100644 --- a/notebooks/python_module/16_network/pet_follow_particle.ipynb +++ b/notebooks/python_module/16_network/pet_follow_particle.ipynb @@ -26,7 +26,7 @@ }, "outputs": [], "source": [ - "import re\n\nfrom matplotlib import colors\nfrom matplotlib import pyplot as plt\nfrom matplotlib.animation import FuncAnimation\nfrom numpy import arange, meshgrid, ones, unique, zeros\n\nfrom py_eddy_tracker import start_logger\nfrom py_eddy_tracker.appli.gui import Anim\nfrom py_eddy_tracker.data import get_demo_path\nfrom py_eddy_tracker.dataset.grid import GridCollection\nfrom py_eddy_tracker.observations.groups import particle_candidate\nfrom py_eddy_tracker.observations.network import NetworkObservations\nfrom py_eddy_tracker.poly import group_obs\n\nstart_logger().setLevel(\"ERROR\")" + "import re\n\nfrom matplotlib import colors\nfrom matplotlib import pyplot as plt\nfrom matplotlib.animation import FuncAnimation\nfrom numpy import arange, meshgrid, ones, unique, zeros\n\nfrom py_eddy_tracker import start_logger\nfrom py_eddy_tracker.appli.gui import Anim\nfrom py_eddy_tracker.data import get_demo_path\nfrom py_eddy_tracker.dataset.grid import GridCollection\nfrom py_eddy_tracker.observations.groups import particle_candidate\nfrom py_eddy_tracker.observations.network import NetworkObservations\n\nstart_logger().setLevel(\"ERROR\")" ] }, { @@ -37,7 +37,7 @@ }, "outputs": [], "source": [ - "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is used to create thumbnail which are not used but consumes same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)" + "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is used to create thumbnail which is not used but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)" ] }, { @@ -109,7 +109,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Particle advection\n^^^^^^^^^^^^^^^^^^\n\n" + "Particle advection\n^^^^^^^^^^^^^^^^^^\nAdvection from speed contour to speed contour (default)\n\n" ] }, { @@ -120,7 +120,7 @@ }, "outputs": [], "source": [ - "step = 1 / 60.0\n\nx, y = meshgrid(arange(24, 36, step), arange(31, 36, step))\nx0, y0 = x.reshape(-1), y.reshape(-1)\n# Pre-order to speed up\n_, i = group_obs(x0, y0, 1, 360)\nx0, y0 = x0[i], y0[i]\n\nt_start, t_end = n.period\ndt = 14\n\nshape = (n.obs.size, 2)\n# Forward run\ni_target_f, pct_target_f = -ones(shape, dtype=\"i4\"), zeros(shape, dtype=\"i1\")\nfor t in arange(t_start, t_end - dt):\n particle_candidate(x0, y0, c, n, t, i_target_f, pct_target_f, n_days=dt)\n\n# Backward run\ni_target_b, pct_target_b = -ones(shape, dtype=\"i4\"), zeros(shape, dtype=\"i1\")\nfor t in arange(t_start + dt, t_end):\n particle_candidate(x0, y0, c, n, t, i_target_b, pct_target_b, n_days=-dt)" + "step = 1 / 60.0\n\nt_start, t_end = int(n.period[0]), int(n.period[1])\ndt = 14\n\nshape = (n.obs.size, 2)\n# Forward run\ni_target_f, pct_target_f = -ones(shape, dtype=\"i4\"), zeros(shape, dtype=\"i1\")\nfor t in arange(t_start, t_end - dt):\n particle_candidate(c, n, step, t, i_target_f, pct_target_f, n_days=dt)\n\n# Backward run\ni_target_b, pct_target_b = -ones(shape, dtype=\"i4\"), zeros(shape, dtype=\"i1\")\nfor t in arange(t_start + dt, t_end):\n particle_candidate(c, n, step, t, i_target_b, pct_target_b, n_days=-dt)" ] }, { diff --git a/notebooks/python_module/16_network/pet_group_anim.ipynb b/notebooks/python_module/16_network/pet_group_anim.ipynb index 7129259c..090170ff 100644 --- a/notebooks/python_module/16_network/pet_group_anim.ipynb +++ b/notebooks/python_module/16_network/pet_group_anim.ipynb @@ -15,7 +15,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n# Network group process\n" + "\nNetwork group process\n=====================\n" ] }, { @@ -37,7 +37,7 @@ }, "outputs": [], "source": [ - "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is use to create thumbnail which are not use but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)" + "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is used to create thumbnail which is not used but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)" ] }, { @@ -156,7 +156,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Anim\n\n" + "Anim\n----\n\n" ] }, { @@ -174,7 +174,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Final Result\n\n" + "Final Result\n------------\n\n" ] }, { @@ -205,7 +205,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.7" } }, "nbformat": 4, diff --git a/notebooks/python_module/16_network/pet_ioannou_2017_case.ipynb b/notebooks/python_module/16_network/pet_ioannou_2017_case.ipynb index 788e94ca..9d659597 100644 --- a/notebooks/python_module/16_network/pet_ioannou_2017_case.ipynb +++ b/notebooks/python_module/16_network/pet_ioannou_2017_case.ipynb @@ -15,7 +15,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n# Ioannou case\nFigure 10 from https://doi.org/10.1002/2017JC013158\n\nWe want to find the Ierapetra Eddy described above in a network demonstration run.\n" + "\nIoannou case\n============\nFigure 10 from https://doi.org/10.1002/2017JC013158\n\nWe want to find the Ierapetra Eddy described above in a network demonstration run.\n" ] }, { @@ -37,7 +37,7 @@ }, "outputs": [], "source": [ - "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is use to create thumbnail which are not use but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)\n\n\n@FuncFormatter\ndef formatter(x, pos):\n return (timedelta(x) + datetime(1950, 1, 1)).strftime(\"%d/%m/%Y\")\n\n\ndef start_axes(title=\"\"):\n fig = plt.figure(figsize=(13, 6))\n ax = fig.add_axes([0.03, 0.03, 0.90, 0.94], projection=GUI_AXES)\n ax.set_xlim(19, 29), ax.set_ylim(31, 35.5)\n ax.set_aspect(\"equal\")\n ax.set_title(title, weight=\"bold\")\n return ax\n\n\ndef timeline_axes(title=\"\"):\n fig = plt.figure(figsize=(15, 5))\n ax = fig.add_axes([0.03, 0.06, 0.90, 0.88])\n ax.set_title(title, weight=\"bold\")\n ax.xaxis.set_major_formatter(formatter), ax.grid()\n return ax\n\n\ndef update_axes(ax, mappable=None):\n ax.grid(True)\n if mappable:\n return plt.colorbar(mappable, cax=ax.figure.add_axes([0.94, 0.05, 0.01, 0.9]))" + "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is used to create thumbnail which is not used but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)\n\n\n@FuncFormatter\ndef formatter(x, pos):\n return (timedelta(x) + datetime(1950, 1, 1)).strftime(\"%d/%m/%Y\")\n\n\ndef start_axes(title=\"\"):\n fig = plt.figure(figsize=(13, 6))\n ax = fig.add_axes([0.03, 0.03, 0.90, 0.94], projection=GUI_AXES)\n ax.set_xlim(19, 29), ax.set_ylim(31, 35.5)\n ax.set_aspect(\"equal\")\n ax.set_title(title, weight=\"bold\")\n return ax\n\n\ndef timeline_axes(title=\"\"):\n fig = plt.figure(figsize=(15, 5))\n ax = fig.add_axes([0.03, 0.06, 0.90, 0.88])\n ax.set_title(title, weight=\"bold\")\n ax.xaxis.set_major_formatter(formatter), ax.grid()\n return ax\n\n\ndef update_axes(ax, mappable=None):\n ax.grid(True)\n if mappable:\n return plt.colorbar(mappable, cax=ax.figure.add_axes([0.94, 0.05, 0.01, 0.9]))" ] }, { @@ -80,7 +80,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Full Timeline\nThe network span for many years... How to cut the interesting part?\n\n" + "Full Timeline\n-------------\nThe network span for many years... How to cut the interesting part?\n\n" ] }, { @@ -98,7 +98,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Sub network and new numbering\nHere we chose to keep only the order 3 segments relatives to our chosen eddy\n\n" + "Sub network and new numbering\n-----------------------------\nHere we chose to keep only the order 3 segments relatives to our chosen eddy\n\n" ] }, { @@ -116,7 +116,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Anim\nQuick movie to see better!\n\n" + "Anim\n----\nQuick movie to see better!\n\n" ] }, { @@ -134,7 +134,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Classic display\n\n" + "Classic display\n---------------\n\n" ] }, { @@ -163,7 +163,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Latitude Timeline\n\n" + "Latitude Timeline\n-----------------\n\n" ] }, { @@ -181,7 +181,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Local radius timeline\nEffective (bold) and Speed (thin) Radius together\n\n" + "Local radius timeline\n---------------------\nEffective (bold) and Speed (thin) Radius together\n\n" ] }, { @@ -199,7 +199,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Parameters timeline\nEffective Radius\n\n" + "Parameters timeline\n-------------------\nEffective Radius\n\n" ] }, { @@ -235,7 +235,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Rotation angle\nFor each obs, fit an ellipse to the contour, with theta the angle from the x-axis,\na the semi ax in x direction and b the semi ax in y dimension\n\n" + "Rotation angle\n--------------\nFor each obs, fit an ellipse to the contour, with theta the angle from the x-axis,\na the semi ax in x direction and b the semi ax in y dimension\n\n" ] }, { @@ -338,7 +338,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.7" } }, "nbformat": 4, diff --git a/notebooks/python_module/16_network/pet_segmentation_anim.ipynb b/notebooks/python_module/16_network/pet_segmentation_anim.ipynb index 34047da4..0a546832 100644 --- a/notebooks/python_module/16_network/pet_segmentation_anim.ipynb +++ b/notebooks/python_module/16_network/pet_segmentation_anim.ipynb @@ -37,7 +37,7 @@ }, "outputs": [], "source": [ - "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is use to create thumbnail which are not use but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)\n\n\ndef get_obs(dataset):\n \"Function to isolate a specific obs\"\n return where(\n (dataset.lat > 33)\n * (dataset.lat < 34)\n * (dataset.lon > 22)\n * (dataset.lon < 23)\n * (dataset.time > 20630)\n * (dataset.time < 20650)\n )[0][0]" + "class VideoAnimation(FuncAnimation):\n def _repr_html_(self, *args, **kwargs):\n \"\"\"To get video in html and have a player\"\"\"\n content = self.to_html5_video()\n return re.sub(\n r'width=\"[0-9]*\"\\sheight=\"[0-9]*\"', 'width=\"100%\" height=\"100%\"', content\n )\n\n def save(self, *args, **kwargs):\n if args[0].endswith(\"gif\"):\n # In this case gif is used to create thumbnail which is not used but consume same time than video\n # So we create an empty file, to save time\n with open(args[0], \"w\") as _:\n pass\n return\n return super().save(*args, **kwargs)\n\n\ndef get_obs(dataset):\n \"Function to isolate a specific obs\"\n return where(\n (dataset.lat > 33)\n * (dataset.lat < 34)\n * (dataset.lon > 22)\n * (dataset.lon < 23)\n * (dataset.time > 20630)\n * (dataset.time < 20650)\n )[0][0]" ] }, {