diff --git a/lib/matplotlib/cbook/__init__.py b/lib/matplotlib/cbook/__init__.py index ed08c5be2ce5..0b64644205e4 100644 --- a/lib/matplotlib/cbook/__init__.py +++ b/lib/matplotlib/cbook/__init__.py @@ -1399,11 +1399,33 @@ def _check_1d(x): return np.atleast_1d(x) else: try: - ndim = x[:, None].ndim - # work around https://github.com/pandas-dev/pandas/issues/27775 - # which mean the shape is not as expected. That this ever worked - # was an unintentional quirk of pandas the above line will raise - # an exception in the future. + # work around + # https://github.com/pandas-dev/pandas/issues/27775 which + # means the shape of multi-dimensional slicing is not as + # expected. That this ever worked was an unintentional + # quirk of pandas and will raise an exception in the + # future. This slicing warns in pandas >= 1.0rc0 via + # https://github.com/pandas-dev/pandas/pull/30588 + # + # < 1.0rc0 : x[:, None].ndim == 1, no warning, custom type + # >= 1.0rc1 : x[:, None].ndim == 2, warns, numpy array + # future : x[:, None] -> raises + # + # This code should correctly identify and coerce to a + # numpy array all pandas versions. + with warnings.catch_warnings(record=True) as w: + warnings.filterwarnings("always", + category=DeprecationWarning, + module='pandas[.*]') + + ndim = x[:, None].ndim + # we have definitely hit a pandas index or series object + # cast to a numpy array. + if len(w) > 0: + return np.asanyarray(x) + # We have likely hit a pandas object, or at least + # something where 2D slicing does not result in a 2D + # object. if ndim < 2: return np.atleast_1d(x) return x diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 8ff5ac45d27d..356b9ad424b3 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1600,6 +1600,15 @@ def test_bar_pandas_indexed(pd): ax.bar(df.x, 1., width=df.width) +def test_pandas_minimal_plot(pd): + # smoke test that series and index objcets do not warn + x = pd.Series([1, 2], dtype="float64") + plt.plot(x, x) + plt.plot(x.index, x) + plt.plot(x) + plt.plot(x.index) + + @image_comparison(baseline_images=['hist_log'], remove_text=True) def test_hist_log():
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: