xarray icon indicating copy to clipboard operation
xarray copied to clipboard

bug in DataArray.plot.pcolormesh

Open hjalmarlucius opened this issue 1 year ago • 2 comments

What happened?

The below code fails - I believe its because _infer_interval_breaks is applied asymmetrically when one coord is string.

What did you expect to happen?

Success.

Minimal Complete Verifiable Example

from xarray import DataArray

x = DataArray(
    [[1, 2, 3], [4, 5, 6]],
    dims=("a", "b"),
    coords={"a": [1, 2], "b": ["a", "b", "c"]},
)
x.plot(infer_intervals=False)  # succeeds
x.plot()  # TypeError: Dimensions of C (2, 3) are incompatible with X (3) and/or Y (3); see help(pcolormesh)

MVCE confirmation

  • [X] Minimal example — the example is as focused as reasonably possible to demonstrate the underlying issue in xarray.
  • [X] Complete example — the example is self-contained, including all data and the text of any traceback.
  • [X] Verifiable example — the example copy & pastes into an IPython prompt or Binder notebook, returning the result.
  • [X] New issue — a search of GitHub Issues suggests this is not a duplicate.

Relevant log output

No response

Anything else we need to know?

No response

Environment

version 2022.3.0

hjalmarlucius avatar Jul 12 '22 00:07 hjalmarlucius

suggested patch:

@@ -1446,9 +1446,10 @@ def pcolormesh(x, y, z, ax, xscale=None, yscale=None, infer_intervals=None, **kw
         else:
             infer_intervals = True

+    either_string = np.issubdtype(x.dtype, str) or np.issubdtype(y.dtype, str)
     if (
         infer_intervals
-        and not np.issubdtype(x.dtype, str)
+        and not either_string
         and (
             (np.shape(x)[0] == np.shape(z)[1])
             or ((x.ndim > 1) and (np.shape(x)[1] == np.shape(z)[1]))
@@ -1463,7 +1464,7 @@ def pcolormesh(x, y, z, ax, xscale=None, yscale=None, infer_intervals=None, **kw

     if (
         infer_intervals
-        and not np.issubdtype(y.dtype, str)
+        and not either_string
         and (np.shape(y)[0] == np.shape(z)[0])
     ):
         if len(y.shape) == 1:

hjalmarlucius avatar Jul 12 '22 00:07 hjalmarlucius

Looks buggy indeed. But maybe either_string needs to handle z inputs as well? Do you want to create a pull request?

Illviljan avatar Jul 12 '22 09:07 Illviljan