From db6f29312d14a75b0d3fdf0c76d1711ab5f35e9b Mon Sep 17 00:00:00 2001 From: BISAL SINGH NAYAL Date: Thu, 1 Jul 2021 17:45:31 +0100 Subject: [PATCH 01/10] Added a public API "update_range" to Slider widget --- lib/matplotlib/tests/test_widgets.py | 6 ++++++ lib/matplotlib/widgets.py | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/matplotlib/tests/test_widgets.py b/lib/matplotlib/tests/test_widgets.py index e522591dd149..bf6258822bbc 100644 --- a/lib/matplotlib/tests/test_widgets.py +++ b/lib/matplotlib/tests/test_widgets.py @@ -266,6 +266,12 @@ def test_slider_valmin_valmax(): valinit=25.0) assert slider.val == slider.valmax +def test_slider_update_valmin_valmax(): + fig, ax = plt.subplots() + slider = widgets.Slider(ax=ax, label='', valmin=0.0, valmax=24.0, + valinit=10.0) + slider.update_range(vmin=20, vmax=50) + assert slider.val == slider.valmin def test_slider_horizontal_vertical(): fig, ax = plt.subplots() diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py index 6963ed31ed81..dd91c019cd58 100644 --- a/lib/matplotlib/widgets.py +++ b/lib/matplotlib/widgets.py @@ -501,6 +501,24 @@ def reset(self): if self.val != self.valinit: self.set_val(self.valinit) + def update_range(self, vmin = None, vmax = None): + """Update the range of the slider""" + if not vmin and not vmax: + raise ValueError( + (f"Argument vmin ({type(vmin)}) has no value" + f"Argument vmax ({type(vmax)}) has no value")) + if vmin: + self.valmin = vmin + if vmax: + self.valmax = vmax + self.val = self._value_in_bounds(self.valinit) + if self.orientation == 'vertical': + self.ax.set_ylim((self.valmin, self.valmax)) + self.hline.set_ydata(self.val) + else: + self.ax.set_xlim((self.valmin, self.valmax)) + self.vline.set_xdata(self.val) + class CheckButtons(AxesWidget): r""" From f4b25d8ba08cad4c535bcfa64b899c0421775fc1 Mon Sep 17 00:00:00 2001 From: BISAL SINGH NAYAL Date: Mon, 5 Jul 2021 22:35:36 +0100 Subject: [PATCH 02/10] Solved issues shown by flakes --- lib/matplotlib/tests/test_widgets.py | 1 + lib/matplotlib/widgets.py | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/tests/test_widgets.py b/lib/matplotlib/tests/test_widgets.py index e80d9e32fef0..d3bbc831b855 100644 --- a/lib/matplotlib/tests/test_widgets.py +++ b/lib/matplotlib/tests/test_widgets.py @@ -417,6 +417,7 @@ def test_slider_valmin_valmax(): valinit=25.0) assert slider.val == slider.valmax + def test_slider_update_valmin_valmax(): fig, ax = plt.subplots() slider = widgets.Slider(ax=ax, label='', valmin=0.0, valmax=24.0, diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py index 01e17246a088..f8f6fbcef8bf 100644 --- a/lib/matplotlib/widgets.py +++ b/lib/matplotlib/widgets.py @@ -809,16 +809,16 @@ def on_changed(self, func): """ return self._observers.connect('changed', lambda val: func(val)) - def update_range(self, vmin = None, vmax = None): + def update_range(self, vmin=None, vmax=None): """Update the range of the slider""" if not vmin and not vmax: raise ValueError( (f"Argument vmin ({type(vmin)}) has no value" - f"Argument vmax ({type(vmax)}) has no value")) + f"Argument vmax ({type(vmax)}) has no value")) if vmin: self.valmin = vmin if vmax: - self.valmax = vmax + self.valmax = vmax self.val = self._value_in_bounds(self.valinit) if self.orientation == 'vertical': self.ax.set_ylim((self.valmin, self.valmax)) From c0bcb22da95d71ad37c0225eedf54222202f9f32 Mon Sep 17 00:00:00 2001 From: BISAL SINGH NAYAL Date: Thu, 1 Jul 2021 17:45:31 +0100 Subject: [PATCH 03/10] Added a public API "update_range" to Slider widget --- lib/matplotlib/tests/test_widgets.py | 6 ++++++ lib/matplotlib/widgets.py | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/matplotlib/tests/test_widgets.py b/lib/matplotlib/tests/test_widgets.py index 0b33a682a50a..e80d9e32fef0 100644 --- a/lib/matplotlib/tests/test_widgets.py +++ b/lib/matplotlib/tests/test_widgets.py @@ -417,6 +417,12 @@ def test_slider_valmin_valmax(): valinit=25.0) assert slider.val == slider.valmax +def test_slider_update_valmin_valmax(): + fig, ax = plt.subplots() + slider = widgets.Slider(ax=ax, label='', valmin=0.0, valmax=24.0, + valinit=10.0) + slider.update_range(vmin=20, vmax=50) + assert slider.val == slider.valmin def test_slider_valstep_snapping(): fig, ax = plt.subplots() diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py index 50cef2f2c01e..01e17246a088 100644 --- a/lib/matplotlib/widgets.py +++ b/lib/matplotlib/widgets.py @@ -809,6 +809,24 @@ def on_changed(self, func): """ return self._observers.connect('changed', lambda val: func(val)) + def update_range(self, vmin = None, vmax = None): + """Update the range of the slider""" + if not vmin and not vmax: + raise ValueError( + (f"Argument vmin ({type(vmin)}) has no value" + f"Argument vmax ({type(vmax)}) has no value")) + if vmin: + self.valmin = vmin + if vmax: + self.valmax = vmax + self.val = self._value_in_bounds(self.valinit) + if self.orientation == 'vertical': + self.ax.set_ylim((self.valmin, self.valmax)) + self.hline.set_ydata(self.val) + else: + self.ax.set_xlim((self.valmin, self.valmax)) + self.vline.set_xdata(self.val) + class CheckButtons(AxesWidget): r""" From f024dffc7757ee189d2fec9362fa7f623d43958f Mon Sep 17 00:00:00 2001 From: BISAL SINGH NAYAL Date: Mon, 5 Jul 2021 22:35:36 +0100 Subject: [PATCH 04/10] Solved issues shown by flakes --- lib/matplotlib/tests/test_widgets.py | 1 + lib/matplotlib/widgets.py | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/tests/test_widgets.py b/lib/matplotlib/tests/test_widgets.py index e80d9e32fef0..d3bbc831b855 100644 --- a/lib/matplotlib/tests/test_widgets.py +++ b/lib/matplotlib/tests/test_widgets.py @@ -417,6 +417,7 @@ def test_slider_valmin_valmax(): valinit=25.0) assert slider.val == slider.valmax + def test_slider_update_valmin_valmax(): fig, ax = plt.subplots() slider = widgets.Slider(ax=ax, label='', valmin=0.0, valmax=24.0, diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py index 01e17246a088..f8f6fbcef8bf 100644 --- a/lib/matplotlib/widgets.py +++ b/lib/matplotlib/widgets.py @@ -809,16 +809,16 @@ def on_changed(self, func): """ return self._observers.connect('changed', lambda val: func(val)) - def update_range(self, vmin = None, vmax = None): + def update_range(self, vmin=None, vmax=None): """Update the range of the slider""" if not vmin and not vmax: raise ValueError( (f"Argument vmin ({type(vmin)}) has no value" - f"Argument vmax ({type(vmax)}) has no value")) + f"Argument vmax ({type(vmax)}) has no value")) if vmin: self.valmin = vmin if vmax: - self.valmax = vmax + self.valmax = vmax self.val = self._value_in_bounds(self.valinit) if self.orientation == 'vertical': self.ax.set_ylim((self.valmin, self.valmax)) From ad59d5a2f0e6f381a7438df707dedcf670df8d3c Mon Sep 17 00:00:00 2001 From: BISAL SINGH NAYAL Date: Tue, 6 Jul 2021 19:05:15 +0100 Subject: [PATCH 05/10] Worked on the given code review comments --- lib/matplotlib/tests/test_widgets.py | 43 ++++++++++++++++++++++++---- lib/matplotlib/widgets.py | 37 ++++++++++++------------ 2 files changed, 57 insertions(+), 23 deletions(-) diff --git a/lib/matplotlib/tests/test_widgets.py b/lib/matplotlib/tests/test_widgets.py index d3bbc831b855..fef0b6e49c1d 100644 --- a/lib/matplotlib/tests/test_widgets.py +++ b/lib/matplotlib/tests/test_widgets.py @@ -418,12 +418,45 @@ def test_slider_valmin_valmax(): assert slider.val == slider.valmax -def test_slider_update_valmin_valmax(): +def test_slider_set_limits(): fig, ax = plt.subplots() - slider = widgets.Slider(ax=ax, label='', valmin=0.0, valmax=24.0, - valinit=10.0) - slider.update_range(vmin=20, vmax=50) - assert slider.val == slider.valmin + slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, + valinit=15.0) + slider.set_limits(vmin=10, vmax=50) + assert slider.valinit == 15 + assert slider.valmax == 50 + assert slider.valmin == 10 + + slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, + valinit=15.0) + slider.set_limits(vmin=20, vmax=40) + assert slider.valinit == 15 + assert slider.valmax == 40 + assert slider.valmin == 20 + + slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, + valinit=15.0) + slider.val = 20 + slider.set_limits(vmin=30, vmax=50) + assert slider.val == 30 + assert slider.valmax == 50 + assert slider.valmin == 30 + + slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, + valinit=15.0) + slider.val = 20 + slider.set_limits(vmin=1, vmax=7) + assert slider.val == 7 + assert slider.valmax == 7 + assert slider.valmin == 1 + + slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, + valinit=15.0) + with pytest.raises(ValueError): + slider.set_limits() + assert slider.valmax == 40 + assert slider.valmin == 10 + def test_slider_valstep_snapping(): fig, ax = plt.subplots() diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py index f8f6fbcef8bf..e646feacce7f 100644 --- a/lib/matplotlib/widgets.py +++ b/lib/matplotlib/widgets.py @@ -529,6 +529,25 @@ def on_changed(self, func): """ return self._observers.connect('changed', lambda val: func(val)) + def set_limits(self, vmin=None, vmax=None): + """Update the range of the slider""" + if vmin is None and vmax is None: + raise ValueError( + (f"Argument vmin ({type(vmin)}) has no value and " + f"Argument vmax ({type(vmax)}) has no value")) + return + if vmin is not None: + self.valmin = vmin + if vmax is not None: + self.valmax = vmax + self.val = self._value_in_bounds(self.val) + if self.orientation == 'vertical': + self.ax.set_ylim((self.valmin, self.valmax)) + self.hline.set_ydata(self.valinit) + else: + self.ax.set_xlim((self.valmin, self.valmax)) + self.vline.set_xdata(self.valinit) + class RangeSlider(SliderBase): """ @@ -809,24 +828,6 @@ def on_changed(self, func): """ return self._observers.connect('changed', lambda val: func(val)) - def update_range(self, vmin=None, vmax=None): - """Update the range of the slider""" - if not vmin and not vmax: - raise ValueError( - (f"Argument vmin ({type(vmin)}) has no value" - f"Argument vmax ({type(vmax)}) has no value")) - if vmin: - self.valmin = vmin - if vmax: - self.valmax = vmax - self.val = self._value_in_bounds(self.valinit) - if self.orientation == 'vertical': - self.ax.set_ylim((self.valmin, self.valmax)) - self.hline.set_ydata(self.val) - else: - self.ax.set_xlim((self.valmin, self.valmax)) - self.vline.set_xdata(self.val) - class CheckButtons(AxesWidget): r""" From fcfa937ec405dfa0c7d260a8af6ef2aac756d5b3 Mon Sep 17 00:00:00 2001 From: BISAL SINGH NAYAL Date: Tue, 13 Jul 2021 11:20:22 +0100 Subject: [PATCH 06/10] Worked on the review comments: 1. Add a set_limits function to the SliderBase class --- lib/matplotlib/tests/test_widgets.py | 5 ++--- lib/matplotlib/widgets.py | 30 +++++++++++++++++----------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/lib/matplotlib/tests/test_widgets.py b/lib/matplotlib/tests/test_widgets.py index fef0b6e49c1d..86837c883366 100644 --- a/lib/matplotlib/tests/test_widgets.py +++ b/lib/matplotlib/tests/test_widgets.py @@ -430,7 +430,7 @@ def test_slider_set_limits(): slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, valinit=15.0) slider.set_limits(vmin=20, vmax=40) - assert slider.valinit == 15 + assert slider.valinit == 20 assert slider.valmax == 40 assert slider.valmin == 20 @@ -452,8 +452,7 @@ def test_slider_set_limits(): slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, valinit=15.0) - with pytest.raises(ValueError): - slider.set_limits() + slider.set_limits() assert slider.valmax == 40 assert slider.valmin == 10 diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py index e646feacce7f..c251d40d1be6 100644 --- a/lib/matplotlib/widgets.py +++ b/lib/matplotlib/widgets.py @@ -306,6 +306,19 @@ def reset(self): if self.val != self.valinit: self.set_val(self.valinit) + def set_limits(self, vmin=None, vmax=None): + """Update the limits of the slider.""" + if vmin is None and vmax is None: + return + if vmin is not None: + self.valmin = vmin + if vmax is not None: + self.valmax = vmax + if self.orientation == 'vertical': + self.ax.set_ylim((self.valmin, self.valmax)) + else: + self.ax.set_xlim((self.valmin, self.valmax)) + class Slider(SliderBase): """ @@ -530,22 +543,15 @@ def on_changed(self, func): return self._observers.connect('changed', lambda val: func(val)) def set_limits(self, vmin=None, vmax=None): - """Update the range of the slider""" - if vmin is None and vmax is None: - raise ValueError( - (f"Argument vmin ({type(vmin)}) has no value and " - f"Argument vmax ({type(vmax)}) has no value")) - return - if vmin is not None: - self.valmin = vmin - if vmax is not None: - self.valmax = vmax + """Update the limits of the slider.""" + super().set_limits(vmin=vmin, vmax=vmax) self.val = self._value_in_bounds(self.val) + # if we reset the slider after updating the limits then we should have + # the proper valinit value + self.valinit = self._value_in_bounds(self.valinit) if self.orientation == 'vertical': - self.ax.set_ylim((self.valmin, self.valmax)) self.hline.set_ydata(self.valinit) else: - self.ax.set_xlim((self.valmin, self.valmax)) self.vline.set_xdata(self.valinit) From 80cadb18de445d377c72e81f9edcb2d174f89a16 Mon Sep 17 00:00:00 2001 From: BISAL SINGH NAYAL Date: Thu, 1 Jul 2021 17:45:31 +0100 Subject: [PATCH 07/10] Added a public API "update_range" to Slider widget --- lib/matplotlib/tests/test_widgets.py | 6 ++++++ lib/matplotlib/widgets.py | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/matplotlib/tests/test_widgets.py b/lib/matplotlib/tests/test_widgets.py index d3bbc831b855..9fc0c52e92e1 100644 --- a/lib/matplotlib/tests/test_widgets.py +++ b/lib/matplotlib/tests/test_widgets.py @@ -417,6 +417,12 @@ def test_slider_valmin_valmax(): valinit=25.0) assert slider.val == slider.valmax +def test_slider_update_valmin_valmax(): + fig, ax = plt.subplots() + slider = widgets.Slider(ax=ax, label='', valmin=0.0, valmax=24.0, + valinit=10.0) + slider.update_range(vmin=20, vmax=50) + assert slider.val == slider.valmin def test_slider_update_valmin_valmax(): fig, ax = plt.subplots() diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py index f8f6fbcef8bf..1b045143e132 100644 --- a/lib/matplotlib/widgets.py +++ b/lib/matplotlib/widgets.py @@ -827,6 +827,24 @@ def update_range(self, vmin=None, vmax=None): self.ax.set_xlim((self.valmin, self.valmax)) self.vline.set_xdata(self.val) + def update_range(self, vmin = None, vmax = None): + """Update the range of the slider""" + if not vmin and not vmax: + raise ValueError( + (f"Argument vmin ({type(vmin)}) has no value" + f"Argument vmax ({type(vmax)}) has no value")) + if vmin: + self.valmin = vmin + if vmax: + self.valmax = vmax + self.val = self._value_in_bounds(self.valinit) + if self.orientation == 'vertical': + self.ax.set_ylim((self.valmin, self.valmax)) + self.hline.set_ydata(self.val) + else: + self.ax.set_xlim((self.valmin, self.valmax)) + self.vline.set_xdata(self.val) + class CheckButtons(AxesWidget): r""" From 24732baeb30bf08f0dc99a97d5deee12b8832100 Mon Sep 17 00:00:00 2001 From: BISAL SINGH NAYAL Date: Mon, 5 Jul 2021 22:35:36 +0100 Subject: [PATCH 08/10] Solved issues shown by flakes --- lib/matplotlib/tests/test_widgets.py | 1 + lib/matplotlib/widgets.py | 18 ------------------ 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/lib/matplotlib/tests/test_widgets.py b/lib/matplotlib/tests/test_widgets.py index 9fc0c52e92e1..431126d32357 100644 --- a/lib/matplotlib/tests/test_widgets.py +++ b/lib/matplotlib/tests/test_widgets.py @@ -417,6 +417,7 @@ def test_slider_valmin_valmax(): valinit=25.0) assert slider.val == slider.valmax + def test_slider_update_valmin_valmax(): fig, ax = plt.subplots() slider = widgets.Slider(ax=ax, label='', valmin=0.0, valmax=24.0, diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py index 1b045143e132..f8f6fbcef8bf 100644 --- a/lib/matplotlib/widgets.py +++ b/lib/matplotlib/widgets.py @@ -827,24 +827,6 @@ def update_range(self, vmin=None, vmax=None): self.ax.set_xlim((self.valmin, self.valmax)) self.vline.set_xdata(self.val) - def update_range(self, vmin = None, vmax = None): - """Update the range of the slider""" - if not vmin and not vmax: - raise ValueError( - (f"Argument vmin ({type(vmin)}) has no value" - f"Argument vmax ({type(vmax)}) has no value")) - if vmin: - self.valmin = vmin - if vmax: - self.valmax = vmax - self.val = self._value_in_bounds(self.valinit) - if self.orientation == 'vertical': - self.ax.set_ylim((self.valmin, self.valmax)) - self.hline.set_ydata(self.val) - else: - self.ax.set_xlim((self.valmin, self.valmax)) - self.vline.set_xdata(self.val) - class CheckButtons(AxesWidget): r""" From a030ebc0a305ca14c3654e21a801881469315109 Mon Sep 17 00:00:00 2001 From: BISAL SINGH NAYAL Date: Tue, 6 Jul 2021 19:05:15 +0100 Subject: [PATCH 09/10] Worked on the given code review comments --- lib/matplotlib/tests/test_widgets.py | 43 ++++++++++++++++++++++++---- lib/matplotlib/widgets.py | 37 ++++++++++++------------ 2 files changed, 57 insertions(+), 23 deletions(-) diff --git a/lib/matplotlib/tests/test_widgets.py b/lib/matplotlib/tests/test_widgets.py index 431126d32357..aa24b97759ef 100644 --- a/lib/matplotlib/tests/test_widgets.py +++ b/lib/matplotlib/tests/test_widgets.py @@ -418,12 +418,45 @@ def test_slider_valmin_valmax(): assert slider.val == slider.valmax -def test_slider_update_valmin_valmax(): +def test_slider_set_limits(): fig, ax = plt.subplots() - slider = widgets.Slider(ax=ax, label='', valmin=0.0, valmax=24.0, - valinit=10.0) - slider.update_range(vmin=20, vmax=50) - assert slider.val == slider.valmin + slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, + valinit=15.0) + slider.set_limits(vmin=10, vmax=50) + assert slider.valinit == 15 + assert slider.valmax == 50 + assert slider.valmin == 10 + + slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, + valinit=15.0) + slider.set_limits(vmin=20, vmax=40) + assert slider.valinit == 15 + assert slider.valmax == 40 + assert slider.valmin == 20 + + slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, + valinit=15.0) + slider.val = 20 + slider.set_limits(vmin=30, vmax=50) + assert slider.val == 30 + assert slider.valmax == 50 + assert slider.valmin == 30 + + slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, + valinit=15.0) + slider.val = 20 + slider.set_limits(vmin=1, vmax=7) + assert slider.val == 7 + assert slider.valmax == 7 + assert slider.valmin == 1 + + slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, + valinit=15.0) + with pytest.raises(ValueError): + slider.set_limits() + assert slider.valmax == 40 + assert slider.valmin == 10 + def test_slider_update_valmin_valmax(): fig, ax = plt.subplots() diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py index f8f6fbcef8bf..e646feacce7f 100644 --- a/lib/matplotlib/widgets.py +++ b/lib/matplotlib/widgets.py @@ -529,6 +529,25 @@ def on_changed(self, func): """ return self._observers.connect('changed', lambda val: func(val)) + def set_limits(self, vmin=None, vmax=None): + """Update the range of the slider""" + if vmin is None and vmax is None: + raise ValueError( + (f"Argument vmin ({type(vmin)}) has no value and " + f"Argument vmax ({type(vmax)}) has no value")) + return + if vmin is not None: + self.valmin = vmin + if vmax is not None: + self.valmax = vmax + self.val = self._value_in_bounds(self.val) + if self.orientation == 'vertical': + self.ax.set_ylim((self.valmin, self.valmax)) + self.hline.set_ydata(self.valinit) + else: + self.ax.set_xlim((self.valmin, self.valmax)) + self.vline.set_xdata(self.valinit) + class RangeSlider(SliderBase): """ @@ -809,24 +828,6 @@ def on_changed(self, func): """ return self._observers.connect('changed', lambda val: func(val)) - def update_range(self, vmin=None, vmax=None): - """Update the range of the slider""" - if not vmin and not vmax: - raise ValueError( - (f"Argument vmin ({type(vmin)}) has no value" - f"Argument vmax ({type(vmax)}) has no value")) - if vmin: - self.valmin = vmin - if vmax: - self.valmax = vmax - self.val = self._value_in_bounds(self.valinit) - if self.orientation == 'vertical': - self.ax.set_ylim((self.valmin, self.valmax)) - self.hline.set_ydata(self.val) - else: - self.ax.set_xlim((self.valmin, self.valmax)) - self.vline.set_xdata(self.val) - class CheckButtons(AxesWidget): r""" From df26a4ce67161d1c37bac8f8d0d54c939c0cfbe8 Mon Sep 17 00:00:00 2001 From: BISAL SINGH NAYAL Date: Tue, 13 Jul 2021 11:20:22 +0100 Subject: [PATCH 10/10] Worked on the review comments: 1. Add a set_limits function to the SliderBase class --- lib/matplotlib/tests/test_widgets.py | 5 ++--- lib/matplotlib/widgets.py | 30 +++++++++++++++++----------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/lib/matplotlib/tests/test_widgets.py b/lib/matplotlib/tests/test_widgets.py index aa24b97759ef..0d9ff2460caa 100644 --- a/lib/matplotlib/tests/test_widgets.py +++ b/lib/matplotlib/tests/test_widgets.py @@ -430,7 +430,7 @@ def test_slider_set_limits(): slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, valinit=15.0) slider.set_limits(vmin=20, vmax=40) - assert slider.valinit == 15 + assert slider.valinit == 20 assert slider.valmax == 40 assert slider.valmin == 20 @@ -452,8 +452,7 @@ def test_slider_set_limits(): slider = widgets.Slider(ax=ax, label='', valmin=10.0, valmax=40.0, valinit=15.0) - with pytest.raises(ValueError): - slider.set_limits() + slider.set_limits() assert slider.valmax == 40 assert slider.valmin == 10 diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py index e646feacce7f..c251d40d1be6 100644 --- a/lib/matplotlib/widgets.py +++ b/lib/matplotlib/widgets.py @@ -306,6 +306,19 @@ def reset(self): if self.val != self.valinit: self.set_val(self.valinit) + def set_limits(self, vmin=None, vmax=None): + """Update the limits of the slider.""" + if vmin is None and vmax is None: + return + if vmin is not None: + self.valmin = vmin + if vmax is not None: + self.valmax = vmax + if self.orientation == 'vertical': + self.ax.set_ylim((self.valmin, self.valmax)) + else: + self.ax.set_xlim((self.valmin, self.valmax)) + class Slider(SliderBase): """ @@ -530,22 +543,15 @@ def on_changed(self, func): return self._observers.connect('changed', lambda val: func(val)) def set_limits(self, vmin=None, vmax=None): - """Update the range of the slider""" - if vmin is None and vmax is None: - raise ValueError( - (f"Argument vmin ({type(vmin)}) has no value and " - f"Argument vmax ({type(vmax)}) has no value")) - return - if vmin is not None: - self.valmin = vmin - if vmax is not None: - self.valmax = vmax + """Update the limits of the slider.""" + super().set_limits(vmin=vmin, vmax=vmax) self.val = self._value_in_bounds(self.val) + # if we reset the slider after updating the limits then we should have + # the proper valinit value + self.valinit = self._value_in_bounds(self.valinit) if self.orientation == 'vertical': - self.ax.set_ylim((self.valmin, self.valmax)) self.hline.set_ydata(self.valinit) else: - self.ax.set_xlim((self.valmin, self.valmax)) self.vline.set_xdata(self.valinit)