{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# IPDxIRR_2F (Ionospheric plasma densities)\n", "\n", "> Abstract: Access to the derived plasma characteristics at 1Hz (level 2 product)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%load_ext watermark\n", "%watermark -i -v -p viresclient,pandas,xarray,matplotlib" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from viresclient import SwarmRequest\n", "import datetime as dt\n", "import matplotlib.pyplot as plt\n", "from matplotlib.dates import DateFormatter\n", "\n", "request = SwarmRequest()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## IPDxIRR_2F product information\n", "\n", "Derived plasma characteristics at 1Hz, for each Swarm spacecraft.\n", "\n", "Documentation:\n", "- https://earth.esa.int/web/guest/missions/esa-eo-missions/swarm/data-handbook/level-2-product-definitions#IPDxIRR_2F" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Check what \"IPD\" data variables are available" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "request.available_collections(\"IPD\", details=False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "request.available_measurements(\"IPD\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fetch three hours of IPD data" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "request.set_collection(\"SW_OPER_IPDAIRR_2F\")\n", "request.set_products(measurements=request.available_measurements(\"IPD\"))\n", "data = request.get_between(\n", " dt.datetime(2014,12,21, 0),\n", " dt.datetime(2014,12,21, 3)\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load and plot using pandas/matplotlib" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = data.as_dataframe()\n", "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig, axes = plt.subplots(nrows=7, ncols=1, figsize=(20,18), sharex=True)\n", "df.plot(ax=axes[0], y=['Background_Ne', 'Foreground_Ne', 'Ne'], alpha=0.8)\n", "df.plot(ax=axes[1], y=['Grad_Ne_at_100km', 'Grad_Ne_at_50km', 'Grad_Ne_at_20km'])\n", "df.plot(ax=axes[2], y=['RODI10s', 'RODI20s'])\n", "df.plot(ax=axes[3], y=['ROD'])\n", "df.plot(ax=axes[4], y=['mROT'])\n", "df.plot(ax=axes[5], y=['delta_Ne10s', 'delta_Ne20s', 'delta_Ne40s'])\n", "df.plot(ax=axes[6], y=['mROTI20s', 'mROTI10s'])\n", "axes[0].set_ylabel(\"[cm$^{-3}$]\")\n", "axes[1].set_ylabel(\"[cm$^{-3}$m$^{-1}$]\")\n", "axes[2].set_ylabel(\"[cm$^{-3}$s$^{-1}$]\")\n", "axes[3].set_ylabel(\"[cm$^{-3}$m$^{-1}$]\")\n", "axes[4].set_ylabel(\"[TECU s$^{-1}$]\")\n", "axes[5].set_ylabel(\"[cm$^{-3}$m$^{-1}$]\")\n", "axes[6].set_ylabel(\"[TECU s$^{-1}$]\")\n", "axes[6].set_xlabel(\"Timestamp\")\n", "\n", "for ax in axes:\n", " # Reformat time axis\n", " # https://www.earthdatascience.org/courses/earth-analytics-python/use-time-series-data-in-python/customize-dates--matplotlib-plots-python/\n", " ax.xaxis.set_major_formatter(DateFormatter(\"%Y-%m-%d\\n%H:%M:%S\"))\n", " ax.legend(loc=\"upper right\")\n", " ax.grid()\n", "fig.subplots_adjust(hspace=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load as xarray" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ds = data.as_xarray()\n", "ds" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Alternative plot setup\n", "\n", "To plot the data from xarray, we need a different plotting setup. This does however give us more control over the plot. The units are extracted directly from the xarray object." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig, axes = plt.subplots(nrows=7, ncols=1, figsize=(20,18), sharex=True)\n", "def subplot(ax=None, y=None, **kwargs):\n", " \"\"\"Plot combination of variables onto a given axis\"\"\"\n", " units = ds[y[0]].units\n", " for var in y:\n", " ax.plot(ds[\"Timestamp\"], ds[var], label=var, **kwargs)\n", " if units != ds[var].units:\n", " raise ValueError(f\"Units mismatch for {var}\")\n", " ax.set_ylabel(f\"[{units}]\")\n", " # Reformat time axis\n", " # https://www.earthdatascience.org/courses/earth-analytics-python/use-time-series-data-in-python/customize-dates--matplotlib-plots-python/\n", " ax.xaxis.set_major_formatter(DateFormatter(\"%Y-%m-%d\\n%H:%M:%S\"))\n", " ax.legend(loc=\"upper right\")\n", " ax.grid()\n", "subplot(ax=axes[0], y=['Background_Ne', 'Foreground_Ne', 'Ne'])\n", "subplot(ax=axes[1], y=['Grad_Ne_at_100km', 'Grad_Ne_at_50km', 'Grad_Ne_at_20km'])\n", "subplot(ax=axes[2], y=['RODI10s', 'RODI20s'])\n", "subplot(ax=axes[3], y=['ROD'])\n", "subplot(ax=axes[4], y=['mROT'])\n", "subplot(ax=axes[5], y=['delta_Ne10s', 'delta_Ne20s', 'delta_Ne40s'])\n", "subplot(ax=axes[6], y=['mROTI20s', 'mROTI10s'])\n", "fig.subplots_adjust(hspace=0)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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" } }, "nbformat": 4, "nbformat_minor": 4 }