diff --git a/xarray/plot/dataarray_plot.py b/xarray/plot/dataarray_plot.py index ed752d3461f..20bc745cbae 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 8789bc2f9c2..404c4518775 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 diff --git a/xarray/tests/test_plot.py b/xarray/tests/test_plot.py index 27f4ded5646..dd3797018af 100644 --- a/xarray/tests/test_plot.py +++ b/xarray/tests/test_plot.py @@ -3407,3 +3407,22 @@ def test_plot1d_filtered_nulls() -> None: actual = pc.get_offsets().shape[0] 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, "D"), + ) + 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