From 135c34b47a18438d031dccf7d9be64bb95554b20 Mon Sep 17 00:00:00 2001 From: Illviljan <14371165+Illviljan@users.noreply.github.com> Date: Wed, 13 Mar 2024 22:39:42 +0100 Subject: [PATCH 1/3] Fix datetime in colorbar --- xarray/plot/dataarray_plot.py | 3 +++ xarray/plot/utils.py | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/xarray/plot/dataarray_plot.py b/xarray/plot/dataarray_plot.py index 8386161bf29..10f32e869e4 100644 --- a/xarray/plot/dataarray_plot.py +++ b/xarray/plot/dataarray_plot.py @@ -1029,6 +1029,9 @@ def newplotfunc( if "label" not in cbar_kwargs: cbar_kwargs["label"] = label_from_attrs(hueplt_norm.data) + if np.issubdtype(hueplt_norm.data.dtype, np.datetime64): + cbar_kwargs["_use_concise_date"] = True + _add_colorbar( primitive, ax, kwargs.get("cbar_ax", None), cbar_kwargs, cmap_params ) diff --git a/xarray/plot/utils.py b/xarray/plot/utils.py index 804e1cfd795..0d3a028fc97 100644 --- a/xarray/plot/utils.py +++ b/xarray/plot/utils.py @@ -710,6 +710,8 @@ def _is_numeric(arr): def _add_colorbar(primitive, ax, cbar_ax, cbar_kwargs, cmap_params): + _use_concise_data = cbar_kwargs.pop("_use_concise_date", False) + cbar_kwargs.setdefault("extend", cmap_params["extend"]) if cbar_ax is None: cbar_kwargs.setdefault("ax", ax) @@ -723,6 +725,9 @@ def _add_colorbar(primitive, ax, cbar_ax, cbar_kwargs, cmap_params): fig = ax.get_figure() cbar = fig.colorbar(primitive, **cbar_kwargs) + if _use_concise_data: + _set_concise_date(ax=cbar.ax, axis="y") + return cbar From fcd28a86de20840ce0ef1fa54f5a02d6e941b848 Mon Sep 17 00:00:00 2001 From: Illviljan <14371165+Illviljan@users.noreply.github.com> Date: Tue, 4 Jun 2024 00:44:25 +0200 Subject: [PATCH 2/3] Add test --- xarray/tests/test_plot.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/xarray/tests/test_plot.py b/xarray/tests/test_plot.py index 27f4ded5646..fd0b4696109 100644 --- a/xarray/tests/test_plot.py +++ b/xarray/tests/test_plot.py @@ -3407,3 +3407,21 @@ def test_plot1d_filtered_nulls() -> None: actual = pc.get_offsets().shape[0] assert expected == actual + + +@pytest.mark.filterwarnings("ignore:Converting non-nanosecond") +@pytest.mark.parametrize("plotfunc", ["lines", "scatter"]) +def test_plot1d_datetime_hue(plotfunc: str) -> None: + time = np.arange( + np.datetime64("2020-01-01"), + np.datetime64("2021-01-01"), + np.timedelta64(1, "ns"), + ) + data = np.arange(time.size) + darray = xr.DataArray(data=data, dims=("time",), coords={"time": time}) + + primitive = getattr(darray.plot, plotfunc)(x="time", hue="time") + + # colorbar should view datetime as numerical and use readable concise dates: + number_of_ticks = len(primitive.colorbar.ax.get_ymajorticklabels()) + assert number_of_ticks < 30 From 1904d24f0ccfe91250725f633f93761816c356f5 Mon Sep 17 00:00:00 2001 From: Illviljan <14371165+Illviljan@users.noreply.github.com> Date: Tue, 4 Jun 2024 00:48:06 +0200 Subject: [PATCH 3/3] Update test_plot.py --- xarray/tests/test_plot.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xarray/tests/test_plot.py b/xarray/tests/test_plot.py index fd0b4696109..dd3797018af 100644 --- a/xarray/tests/test_plot.py +++ b/xarray/tests/test_plot.py @@ -3409,13 +3409,14 @@ def test_plot1d_filtered_nulls() -> None: assert expected == actual +@requires_matplotlib @pytest.mark.filterwarnings("ignore:Converting non-nanosecond") @pytest.mark.parametrize("plotfunc", ["lines", "scatter"]) def test_plot1d_datetime_hue(plotfunc: str) -> None: time = np.arange( np.datetime64("2020-01-01"), np.datetime64("2021-01-01"), - np.timedelta64(1, "ns"), + np.timedelta64(1, "D"), ) data = np.arange(time.size) darray = xr.DataArray(data=data, dims=("time",), coords={"time": time})