.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "python_module/02_eddy_identification/pet_sla_and_adt.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. or to run this example in your browser via Binder .. rst-class:: sphx-glr-example-title .. _sphx_glr_python_module_02_eddy_identification_pet_sla_and_adt.py: Eddy detection on SLA and ADT ============================= .. GENERATED FROM PYTHON SOURCE LINES 6-14 .. code-block:: Python from datetime import datetime from matplotlib import pyplot as plt from py_eddy_tracker import data from py_eddy_tracker.dataset.grid import RegularGridDataset .. GENERATED FROM PYTHON SOURCE LINES 15-30 .. code-block:: Python def start_axes(title): fig = plt.figure(figsize=(13, 5)) ax = fig.add_axes([0.03, 0.03, 0.90, 0.94]) ax.set_xlim(-6, 36.5), ax.set_ylim(30, 46) ax.set_aspect("equal") ax.set_title(title) return ax def update_axes(ax, mappable=None): ax.grid() if mappable: plt.colorbar(mappable, cax=ax.figure.add_axes([0.95, 0.05, 0.01, 0.9])) .. GENERATED FROM PYTHON SOURCE LINES 31-32 Load Input grid, ADT will be used to detect eddies .. GENERATED FROM PYTHON SOURCE LINES 32-47 .. code-block:: Python g = RegularGridDataset( data.get_demo_path("dt_med_allsat_phy_l4_20160515_20190101.nc"), "longitude", "latitude", ) g.add_uv("adt", "ugos", "vgos") g.add_uv("sla", "ugosa", "vgosa") wavelength = 400 g.copy("adt", "adt_raw") g.copy("sla", "sla_raw") g.bessel_high_filter("adt", wavelength) g.bessel_high_filter("sla", wavelength) date = datetime(2016, 5, 15) .. GENERATED FROM PYTHON SOURCE LINES 48-57 .. code-block:: Python kwargs_a_adt = dict( lw=0.5, label="Anticyclonic ADT ({nb_obs} eddies)", ref=-10, color="k" ) kwargs_c_adt = dict(lw=0.5, label="Cyclonic ADT ({nb_obs} eddies)", ref=-10, color="r") kwargs_a_sla = dict( lw=0.5, label="Anticyclonic SLA ({nb_obs} eddies)", ref=-10, color="g" ) kwargs_c_sla = dict(lw=0.5, label="Cyclonic SLA ({nb_obs} eddies)", ref=-10, color="b") .. GENERATED FROM PYTHON SOURCE LINES 58-59 Run algorithm of detection .. GENERATED FROM PYTHON SOURCE LINES 59-62 .. code-block:: Python a_adt, c_adt = g.eddy_identification("adt", "ugos", "vgos", date, 0.002) a_sla, c_sla = g.eddy_identification("sla", "ugosa", "vgosa", date, 0.002) .. rst-class:: sphx-glr-script-out .. code-block:: none /home/docs/checkouts/readthedocs.org/user_builds/py-eddy-tracker/conda/latest/lib/python3.12/site-packages/py_eddy_tracker/dataset/grid.py:1915: RuntimeWarning: invalid value encountered in sqrt self._speed_ev = sqrt(u * u + v * v) /home/docs/checkouts/readthedocs.org/user_builds/py-eddy-tracker/conda/latest/lib/python3.12/site-packages/numpy/lib/function_base.py:4824: UserWarning: Warning: 'partition' will ignore the 'mask' of the MaskedArray. arr.partition( .. GENERATED FROM PYTHON SOURCE LINES 63-64 over filtered .. GENERATED FROM PYTHON SOURCE LINES 64-74 .. code-block:: Python ax = start_axes(f"ADT (m) filtered ({wavelength}km)") m = g.display(ax, "adt", vmin=-0.15, vmax=0.15) a_adt.display(ax, **kwargs_a_adt), c_adt.display(ax, **kwargs_c_adt) ax.legend(), update_axes(ax, m) ax = start_axes(f"SLA (m) filtered ({wavelength}km)") m = g.display(ax, "sla", vmin=-0.15, vmax=0.15) a_sla.display(ax, **kwargs_a_sla), c_sla.display(ax, **kwargs_c_sla) ax.legend(), update_axes(ax, m) .. rst-class:: sphx-glr-horizontal * .. image-sg:: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_001.png :alt: ADT (m) filtered (400km) :srcset: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_001.png :class: sphx-glr-multi-img * .. image-sg:: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_002.png :alt: SLA (m) filtered (400km) :srcset: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_002.png :class: sphx-glr-multi-img .. rst-class:: sphx-glr-script-out .. code-block:: none (, None) .. GENERATED FROM PYTHON SOURCE LINES 75-76 over raw .. GENERATED FROM PYTHON SOURCE LINES 76-86 .. code-block:: Python ax = start_axes("ADT (m)") m = g.display(ax, "adt_raw", vmin=-0.15, vmax=0.15) a_adt.display(ax, **kwargs_a_adt), c_adt.display(ax, **kwargs_c_adt) ax.legend(), update_axes(ax, m) ax = start_axes("SLA (m)") m = g.display(ax, "sla_raw", vmin=-0.15, vmax=0.15) a_sla.display(ax, **kwargs_a_sla), c_sla.display(ax, **kwargs_c_sla) ax.legend(), update_axes(ax, m) .. rst-class:: sphx-glr-horizontal * .. image-sg:: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_003.png :alt: ADT (m) :srcset: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_003.png :class: sphx-glr-multi-img * .. image-sg:: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_004.png :alt: SLA (m) :srcset: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_004.png :class: sphx-glr-multi-img .. rst-class:: sphx-glr-script-out .. code-block:: none (, None) .. GENERATED FROM PYTHON SOURCE LINES 87-88 Display detection .. GENERATED FROM PYTHON SOURCE LINES 88-96 .. code-block:: Python ax = start_axes("Eddies detected") a_adt.display(ax, **kwargs_a_adt) a_sla.display(ax, **kwargs_a_sla) c_adt.display(ax, **kwargs_c_adt) c_sla.display(ax, **kwargs_c_sla) ax.legend() update_axes(ax) .. image-sg:: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_005.png :alt: Eddies detected :srcset: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_005.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 97-100 Match ----------------------- Where cyclone meet anticyclone .. GENERATED FROM PYTHON SOURCE LINES 100-112 .. code-block:: Python i_c_adt, i_a_sla, c = c_adt.match(a_sla, cmin=0.01) i_a_adt, i_c_sla, c = a_adt.match(c_sla, cmin=0.01) ax = start_axes("Cyclone share area with anticyclone") a_adt.index(i_a_adt).display(ax, **kwargs_a_adt) c_adt.index(i_c_adt).display(ax, **kwargs_c_adt) a_sla.index(i_a_sla).display(ax, **kwargs_a_sla) c_sla.index(i_c_sla).display(ax, **kwargs_c_sla) ax.legend() update_axes(ax) .. image-sg:: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_006.png :alt: Cyclone share area with anticyclone :srcset: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_006.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 113-115 Scatter plot ------------ .. GENERATED FROM PYTHON SOURCE LINES 115-118 .. code-block:: Python i_a_adt, i_a_sla, c = a_adt.match(a_sla, cmin=0.1) i_c_adt, i_c_sla, c = c_adt.match(c_sla, cmin=0.1) .. GENERATED FROM PYTHON SOURCE LINES 119-120 where is lonely eddies .. GENERATED FROM PYTHON SOURCE LINES 120-128 .. code-block:: Python ax = start_axes("Eddies with no match") a_adt.index(i_a_adt, reverse=True).display(ax, **kwargs_a_adt) c_adt.index(i_c_adt, reverse=True).display(ax, **kwargs_c_adt) a_sla.index(i_a_sla, reverse=True).display(ax, **kwargs_a_sla) c_sla.index(i_c_sla, reverse=True).display(ax, **kwargs_c_sla) ax.legend() update_axes(ax) .. image-sg:: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_007.png :alt: Eddies with no match :srcset: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_007.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 129-160 .. code-block:: Python fig = plt.figure(figsize=(12, 12)) fig.suptitle(f"Scatter plot (A : {i_a_adt.shape[0]}, C : {i_c_adt.shape[0]} matches)") for i, (label, field, factor, stop) in enumerate( ( ("speed radius (km)", "radius_s", 0.001, 80), ("outter radius (km)", "radius_e", 0.001, 120), ("amplitude (cm)", "amplitude", 100, 25), ("speed max (cm/s)", "speed_average", 100, 25), ) ): ax = fig.add_subplot(2, 2, i + 1, title=label) ax.set_xlabel("Absolute Dynamic Topography") ax.set_ylabel("Sea Level Anomaly") ax.plot( a_adt[field][i_a_adt] * factor, a_sla[field][i_a_sla] * factor, "r.", label="Anticyclonic", ) ax.plot( c_adt[field][i_c_adt] * factor, c_sla[field][i_c_sla] * factor, "b.", label="Cyclonic", ) ax.set_aspect("equal"), ax.grid() ax.plot((0, 1000), (0, 1000), "g") ax.set_xlim(0, stop), ax.set_ylim(0, stop) ax.legend() .. image-sg:: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_008.png :alt: Scatter plot (A : 48, C : 36 matches), speed radius (km), outter radius (km), amplitude (cm), speed max (cm/s) :srcset: /python_module/02_eddy_identification/images/sphx_glr_pet_sla_and_adt_008.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 2.902 seconds) .. _sphx_glr_download_python_module_02_eddy_identification_pet_sla_and_adt.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: binder-badge .. image:: images/binder_badge_logo.svg :target: https://mybinder.org/v2/gh/AntSimi/py-eddy-tracker/master?urlpath=lab/tree/notebooks/python_module/02_eddy_identification/pet_sla_and_adt.ipynb :alt: Launch binder :width: 150 px .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: pet_sla_and_adt.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: pet_sla_and_adt.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: pet_sla_and_adt.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_