From c8d673a4e6c87da1b2b8fd625e3c3cc58dec7a60 Mon Sep 17 00:00:00 2001 From: FloraSauerbronn Date: Wed, 12 Jun 2024 16:24:18 -0300 Subject: [PATCH 1/4] Add new ax feature --- gliderpy/plotting.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gliderpy/plotting.py b/gliderpy/plotting.py index 489b410..0bbfdc4 100644 --- a/gliderpy/plotting.py +++ b/gliderpy/plotting.py @@ -46,6 +46,7 @@ def plot_track(df: pd.DataFrame) -> tuple(plt.Figure, plt.Axes): def plot_transect( df: pd.DataFrame, var: str, + ax: plt.Axes = None, **kw: dict, ) -> tuple(plt.Figure, plt.Axes): """Make a scatter plot of depth vs time coloured by a user defined @@ -56,7 +57,11 @@ def plot_transect( """ cmap = kw.get("cmap", None) - fig, ax = plt.subplots(figsize=(17, 2)) + if ax is None: + fig, ax = plt.subplots(figsize=(17, 2)) + else: + fig = ax.figure + cs = ax.scatter( df.index, df["pressure"], From 475c989a7cb2e24bc3c7720c87811d5e2a812efe Mon Sep 17 00:00:00 2001 From: FloraSauerbronn Date: Fri, 14 Jun 2024 15:24:36 -0300 Subject: [PATCH 2/4] Adding new function plot_ctd in to plotting.py --- gliderpy/plotting.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/gliderpy/plotting.py b/gliderpy/plotting.py index 0bbfdc4..5710a9e 100644 --- a/gliderpy/plotting.py +++ b/gliderpy/plotting.py @@ -9,6 +9,7 @@ import cartopy.crs as ccrs import matplotlib.dates as mdates import matplotlib.pyplot as plt + except ModuleNotFoundError: warnings.warn( "gliderpy requires matplotlib and cartopy for plotting.", @@ -81,4 +82,40 @@ def plot_transect( ax.set_ylabel("pressure") return fig, ax +@register_dataframe_method +def plot_ctd( + df: pd.DataFrame, + var: str, + ax: plt.Axes = None, + color: str = None +) -> tuple: + """Make a CTD profile plot of pressure vs property + depending on what variable was chosen. + + :param var: variable to plot against pressure + :param ax: existing axis to plot on (default: None) + :param color: color for the plot line (default: None) + :return: figure, axes + """ + g = df.groupby(["longitude", "latitude"]) + profile = g.get_group((list(g.groups)[0])) + if ax is None: + fig, ax1 = plt.subplots(figsize=(5, 6)) + ax1.plot(profile[var], -profile["pressure"], label=var, color=color) + ax1.set_ylabel('Pressure') + ax1.set_xlabel(var) + ax1.legend() + return fig, ax1 + else: + fig = ax.get_figure() + ax2 = ax.twiny() # Create a new twinned axis + ax2.plot(profile[var], -profile["pressure"], label=var, color=color) + ax2.set_xlabel(var) + + # Handle legends + lines, labels = ax.get_legend_handles_labels() + lines2, labels2 = ax2.get_legend_handles_labels() + ax.legend(lines + lines2, labels + labels2, loc="lower center") + + return fig, ax2 \ No newline at end of file From d2526f071fba96c81d3f6d95966e8ffe040bde9d Mon Sep 17 00:00:00 2001 From: FloraSauerbronn Date: Fri, 14 Jun 2024 15:49:07 -0300 Subject: [PATCH 3/4] Add new function test_plot_ctd --- tests/test_plotting.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/test_plotting.py b/tests/test_plotting.py index 1be9d70..c73ab7c 100644 --- a/tests/test_plotting.py +++ b/tests/test_plotting.py @@ -5,6 +5,7 @@ from pathlib import Path from gliderpy.plotting import plot_track from gliderpy.plotting import plot_transect +from gliderpy.plotting import plot_ctd from gliderpy.fetchers import GliderDataFetcher root = Path(__file__).parent @@ -34,3 +35,16 @@ def test_plot_transect(): # Return the figure for pytest-mpl to compare return fig + + +@pytest.mark.mpl_image_compare(baseline_dir=root.joinpath("baseline/")) +def test_plot_ctd(): + glider_grab = GliderDataFetcher() + + glider_grab.fetcher.dataset_id = "whoi_406-20160902T1700" + df = glider_grab.to_pandas() + # Generate the plot + fig, ax = plot_ctd(df, 'temperature') + + # Return the figure for pytest-mpl to compare + return fig From 849fc7838711ff515cdfa19086d6e8de936cad88 Mon Sep 17 00:00:00 2001 From: FloraSauerbronn Date: Fri, 14 Jun 2024 15:51:06 -0300 Subject: [PATCH 4/4] Add new baseline figure of ctd plot --- tests/baseline/test_plot_ctd.png | Bin 0 -> 23304 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/baseline/test_plot_ctd.png diff --git a/tests/baseline/test_plot_ctd.png b/tests/baseline/test_plot_ctd.png new file mode 100644 index 0000000000000000000000000000000000000000..981478db22c49fcf774de248c829bc4d20ed62be GIT binary patch literal 23304 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 NrOi?Cisr~H-QP!61CRg! literal 0 HcmV?d00001