From f78e8eccfc96674be027019c1549c778fba96d44 Mon Sep 17 00:00:00 2001 From: MeeseeksMachine <39504233+meeseeksmachine@users.noreply.github.com> Date: Sun, 12 Feb 2023 23:56:33 +0100 Subject: [PATCH] Backport PR #25196: Add deprecation for setting data with non sequence type in `Line2D` (#25201) Co-authored-by: Oscar Gustafsson --- .../next_api_changes/deprecations/25196-EP.rst | 4 ++++ lib/matplotlib/lines.py | 18 ++++++++++++++++-- lib/matplotlib/tests/test_lines.py | 8 ++++++-- 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 doc/api/next_api_changes/deprecations/25196-EP.rst 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)