diff --git a/lib/matplotlib/cbook/__init__.py b/lib/matplotlib/cbook/__init__.py index 774643fc9c99..5a955ed459c5 100644 --- a/lib/matplotlib/cbook/__init__.py +++ b/lib/matplotlib/cbook/__init__.py @@ -1333,7 +1333,12 @@ def _check_1d(x): """Convert scalars to 1D arrays; pass-through arrays as is.""" # Unpack in case of e.g. Pandas or xarray object x = _unpack_to_numpy(x) - if not hasattr(x, 'shape') or len(x.shape) < 1: + # plot requires `shape` and `ndim`. If passed an + # object that doesn't provide them, then force to numpy array. + # Note this will strip unit information. + if (not hasattr(x, 'shape') or + not hasattr(x, 'ndim') or + len(x.shape) < 1): return np.atleast_1d(x) else: return x diff --git a/lib/matplotlib/tests/test_units.py b/lib/matplotlib/tests/test_units.py index 93a12cebb2c8..d3b8c5a71643 100644 --- a/lib/matplotlib/tests/test_units.py +++ b/lib/matplotlib/tests/test_units.py @@ -264,3 +264,22 @@ def test_empty_default_limits(quantity_converter): fig.draw_without_rendering() assert ax.get_ylim() == (0, 100) assert ax.get_xlim() == (28.5, 31.5) + + +# test array-like objects... +class Kernel: + def __init__(self, array): + self._array = np.asanyarray(array) + + def __array__(self): + return self._array + + @property + def shape(self): + return self._array.shape + + +def test_plot_kernel(): + # just a smoketest that fail + kernel = Kernel([1, 2, 3, 4, 5]) + plt.plot(kernel)