8000 Merge pull request #15949 from anntzer/slider · matplotlib/matplotlib@9d40170 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9d40170

Browse files
authored
Merge pull request #15949 from anntzer/slider
Simplify implementation of SubplotTool.
2 parents fb58962 + 7f6ad35 commit 9d40170

File tree

2 files changed

+71
-67
lines changed

2 files changed

+71
-67
lines changed

doc/api/next_api_changes/deprecations.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,3 +355,12 @@ The *dummy* parameter of `.RendererPgf` is deprecated.
355355
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
356356
The ``set_factor`` method of :mod:`mpl_toolkits.axisartist` locators (which are
357357
different from "standard" Matplotlib tick locators) is deprecated.
358+
359+
`.widgets.SubplotTool` callbacks and axes
360+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
361+
The ``funcleft``, ``funcright``, ``funcbottom``, ``functop``, ``funcwspace``,
362+
and ``funchspace`` methods of `.widgets.SubplotTool` are deprecated.
363+
364+
The ``axleft``, ``axright``, ``axbottom``, ``axtop``, ``axwspace``, and
365+
``axhspace`` attributes of `.widgets.SubplotTool` are deprecated. Access the
366+
``ax`` attribute of the corresponding slider, if needed.

lib/matplotlib/widgets.py

Lines changed: 62 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,51 +1120,25 @@ def __init__(self, targetfig, toolfig):
11201120

11211121
self.targetfig = targetfig
11221122
toolfig.subplots_adjust(left=0.2, right=0.9)
1123-
1124-
self.axleft = toolfig.add_subplot(711)
1125-
self.axleft.set_title('Click on slider to adjust subplot param')
1126-
self.axleft.set_navigate(False)
1127-
1128-
self.sliderleft = Slider(self.axleft, 'left',
1129-
0, 1, targetfig.subplotpars.left,
1130-
closedmax=False)
1131-
self.sliderleft.on_changed(self.funcleft)
1132-
1133-
self.axbottom = toolfig.add_subplot(712)
1134-
self.axbottom.set_navigate(False)
1135-
self.sliderbottom = Slider(self.axbottom,
1136-
'bottom', 0, 1,
1137-
targetfig.subplotpars.bottom,
1138-
closedmax=False)
1139-
self.sliderbottom.on_changed(self.funcbottom)
1140-
1141-
self.axright = toolfig.add_subplot(713)
1142-
self.axright.set_navigate(False)
1143-
self.sliderright = Slider(self.axright, 'right', 0, 1,
1144-
targetfig.subplotpars.right,
1145-
closedmin=False)
1146-
self.sliderright.on_changed(self.funcright)
1147-
1148-
self.axtop = toolfig.add_subplot(714)
1149-
self.axtop.set_navigate(False)
1150-
self.slidertop = Slider(self.axtop, 'top', 0, 1,
1151-
targetfig.subplotpars.top,
1152-
closedmin=False)
1153-
self.slidertop.on_changed(self.functop)
1154-
1155-
self.axwspace = toolfig.add_subplot(715)
1156-
self.axwspace.set_navigate(False)
1157-
self.sliderwspace = Slider(self.axwspace, 'wspace',
1158-
0, 1, targetfig.subplotpars.wspace,
1159-
closedmax=False)
1160-
self.sliderwspace.on_changed(self.funcwspace)
1161-
1162-
self.axhspace = toolfig.add_subplot(716)
1163-
self.axhspace.set_navigate(False)
1164-
self.sliderhspace = Slider(self.axhspace, 'hspace',
1165-
0, 1, targetfig.subplotpars.hspace,
1166-
closedmax=False)
1167-
self.sliderhspace.on_changed(self.funchspace)
1123+
toolfig.suptitle("Click on slider to adjust subplot param")
1124+
1125+
self._sliders = []
1126+
names = ["left", "bottom", "right", "top", "wspace", "hspace"]
1127+
# The last subplot, removed below, keeps space for the "Reset" button.
1128+
for name, ax in zip(names, toolfig.subplots(len(names) + 1)):
1129+
ax.set_navigate(False)
1130+
slider = Slider(ax, name,
1131+
0, 1, getattr(targetfig.subplotpars, name))
1132+
slider.on_changed(self._on_slider_changed)
1133+
self._sliders.append(slider)
1134+
toolfig.axes[-1].remove()
1135+
(self.sliderleft, self.sliderbottom, self.sliderright, self.slidertop,
1136+
self.sliderwspace, self.sliderhspace) = self._sliders
1137+
for slider in [self.sliderleft, self.sliderbottom,
1138+
self.sliderwspace, self.sliderhspace]:
1139+
slider.closedmax = False
1140+
for slider in [self.sliderright, self.slidertop]:
1141+
slider.closedmin = False
11681142

11691143
# constraints
11701144
self.sliderleft.slidermax = self.sliderright
@@ -1175,57 +1149,78 @@ def __init__(self, targetfig, toolfig):
11751149
bax = toolfig.add_axes([0.8, 0.05, 0.15, 0.075])
11761150
self.buttonreset = Button(bax, 'Reset')
11771151

1178-
sliders = (self.sliderleft, self.sliderbottom, self.sliderright,
1179-
self.slidertop, self.sliderwspace, self.sliderhspace,)
1180-
1181-
def func(event):
1182-
with ExitStack() as stack:
1183-
# Temporarily disable drawing on self and self's sliders.
1184-
stack.enter_context(cbook._setattr_cm(self, drawon=False))
1185-
for slider in sliders:
1186-
stack.enter_context(
1187-
cbook._setattr_cm(slider, drawon=False))
1188-
# Reset the slider to the initial position.
1189-
for slider in sliders:
1190-
slider.reset()
1191-
# Draw the canvas.
1192-
if self.drawon:
1193-
toolfig.canvas.draw()
1194-
self.targetfig.canvas.draw()
1195-
1196-
# during reset there can be a temporary invalid state
1197-
# depending on the order of the reset so we turn off
1198-
# validation for the resetting
1152+
# During reset there can be a temporary invalid state depending on the
1153+
# order of the reset so we turn off validation for the resetting
11991154
validate = toolfig.subplotpars.validate
12001155
toolfig.subplotpars.validate = False
1201-
self.buttonreset.on_clicked(func)
1156+
self.buttonreset.on_clicked(self._on_reset)
12021157
toolfig.subplotpars.validate = validate
12031158

1159+
def _on_slider_changed(self, _):
1160+
self.targetfig.subplots_adjust(
1161+
**{slider.label.get_text(): slider.val
1162+
for slider in self._sliders})
1163+
if self.drawon:
1164+
self.targetfig.canvas.draw()
1165+
1166+
def _on_reset(self, event):
1167+
with ExitStack() as stack:
1168+
# Temporarily disable drawing on self and self's sliders.
1169+
stack.enter_context(cbook._setattr_cm(self, drawon=False))
1170+
for slider in self._sliders:
1171+
stack.enter_context(cbook._setattr_cm(slider, drawon=False))
1172+
# Reset the slider to the initial position.
1173+
for slider in self._sliders:
1174+
slider.reset()
1175+
# Draw the canvas.
1176+
if self.drawon:
1177+
event.canvas.draw()
1178+
self.targetfig.canvas.draw()
1179+
1180+
axleft = cbook.deprecated("3.3", name="axleft")(
1181+
property(lambda self: self.sliderleft.ax))
1182+
axright = cbook.deprecated("3.3", name="axright")(
1183+
property(lambda self: self.sliderright.ax))
1184+
axbottom = cbook.deprecated("3.3", name="axbottom")(
1185+
property(lambda self: self.sliderbottom.ax))
1186+
axtop = cbook.deprecated("3.3", name="axtop")(
1187+
property(lambda self: self.slidertop.ax))
1188+
axwspace = cbook.deprecated("3.3", name="axwspace")(
1189+
property(lambda self: self.sliderwspace.ax))
1190+
axhspace = cbook.deprecated("3.3", name="axhspace")(
1191+
property(lambda self: self.sliderhspace.ax))
1192+
1193+
@cbook.deprecated("3.3")
12041194
def funcleft(self, val):
12051195
self.targetfig.subplots_adjust(left=val)
12061196
if self.drawon:
12071197
self.targetfig.canvas.draw()
12081198

1199+
@cbook.deprecated("3.3")
12091200
def funcright(self, val):
12101201
self.targetfig.subplots_adjust(right=val)
12111202
if self.drawon:
12121203
self.targetfig.canvas.draw()
12131204

1205+
@cbook.deprecated("3.3")
12141206
def funcbottom(self, val):
12151207
self.targetfig.subplots_adjust(bottom=val)
12161208
if self.drawon:
12171209
self.targetfig.canvas.draw()
12181210

1211+
@cbook.deprecated("3.3")
12191212
def functop(self, val):
12201213
self.targetfig.subplots_adjust(top=val)
12211214
if self.drawon:
12221215
self.targetfig.canvas.draw()
12231216

1217+
@cbook.deprecated("3.3")
12241218
def funcwspace(self, val):
12251219
self.targetfig.subplots_adjust(wspace=val)
12261220
if self.drawon:
12271221
self.targetfig.canvas.draw()
12281222

1223+
@cbook.deprecated("3.3")
12291224
def funchspace(self, val):
12301225
self.targetfig.subplots_adjust(hspace=val)
12311226
if self.drawon:

0 commit comments

Comments
 (0)
0