diff --git a/doc/api/next_api_changes/deprecations/25196-EP.rst b/doc/api/next_api_changes/deprecations/25196-EP.rst new file mode 100644 index 000000000000..99f55401976d --- /dev/null +++ b/doc/api/next_api_changes/deprecations/25196-EP.rst @@ -0,0 +1,4 @@ +``Line2D`` +~~~~~~~~~~ +When creating a Line2D or using `.Line2D.set_xdata` and `.Line2D.set_ydata`, +passing x/y data as non sequence is deprecated. diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index f843ccd49fee..db0ce3ba0cea 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -1275,7 +1275,14 @@ def set_xdata(self, x): x : 1D array """ if not np.iterable(x): - raise RuntimeError('x must be a sequence') + # When deprecation cycle is completed + # raise RuntimeError('x must be a sequence') + _api.warn_deprecated( + since=3.7, + message="Setting data with a non sequence type " + "is deprecated since %(since)s and will be " + "remove %(removal)s") + x = [x, ] self._xorig = copy.copy(x) self._invalidx = True self.stale = True @@ -1289,7 +1296,14 @@ def set_ydata(self, y): y : 1D array """ if not np.iterable(y): - raise RuntimeError('y must be a sequence') + # When deprecation cycle is completed + # raise RuntimeError('y must be a sequence') + _api.warn_deprecated( + since=3.7, + message="Setting data with a non sequence type " + "is deprecated since %(since)s and will be " + "remove %(removal)s") + y = [y, ] self._yorig = copy.copy(y) self._invalidy = True self.stale = True diff --git a/lib/matplotlib/tests/test_lines.py b/lib/matplotlib/tests/test_lines.py index 1f25b84d8081..7eecf5675a4b 100644 --- a/lib/matplotlib/tests/test_lines.py +++ b/lib/matplotlib/tests/test_lines.py @@ -20,6 +20,7 @@ import matplotlib.pyplot as plt import matplotlib.transforms as mtransforms from matplotlib.testing.decorators import image_comparison, check_figures_equal +from matplotlib._api.deprecation import MatplotlibDeprecationWarning def test_segment_hits(): @@ -91,9 +92,12 @@ def test_invalid_line_data(): mlines.Line2D([], 1) line = mlines.Line2D([], []) - with pytest.raises(RuntimeError, match='x must be'): + # when deprecation cycle is completed + # with pytest.raises(RuntimeError, match='x must be'): + with pytest.warns(MatplotlibDeprecationWarning): line.set_xdata(0) - with pytest.raises(RuntimeError, match='y must be'): + # with pytest.raises(RuntimeError, match='y must be'): + with pytest.warns(MatplotlibDeprecationWarning): line.set_ydata(0)