Skip to content

Commit af6734f

Browse files
committed
scroll to zoom in zoom/pan tools
1 parent 0ff5997 commit af6734f

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

lib/matplotlib/backend_tools.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,8 @@ def __init__(self, *args):
572572
self._xypress = None
573573
self._idPress = None
574574
self._idRelease = None
575+
self._idScroll = None
576+
self.base_scale = 2.
575577

576578
def enable(self, event):
577579
"""Connect press/release events and lock the canvas"""
@@ -580,18 +582,49 @@ def enable(self, event):
580582
'button_press_event', self._press)
581583
self._idRelease = self.figure.canvas.mpl_connect(
582584
'button_release_event', self._release)
585+
self._idScroll = self.figure.canvas.mpl_connect(
586+
'scroll_event', self.scroll_zoom)
583587

584588
def disable(self, event):
585589
"""Release the canvas and disconnect press/release events"""
586590
self._cancel_action()
587591
self.figure.canvas.widgetlock.release(self)
588592
self.figure.canvas.mpl_disconnect(self._idPress)
589593
self.figure.canvas.mpl_disconnect(self._idRelease)
594+
self.figure.canvas.mpl_disconnect(self._idScroll)
590595

591596
def trigger(self, sender, event, data=None):
592597
self.navigation.get_tool('viewpos').add_figure()
593598
ToolToggleBase.trigger(self, sender, event, data)
594599

600+
def scroll_zoom(self, event):
601+
# https://gist.github.com/tacaswell/3144287
602+
if event.inaxes is None:
603+
return
604+
ax = event.inaxes
605+
cur_xlim = ax.get_xlim()
606+
cur_ylim = ax.get_ylim()
607+
# set the range
608+
cur_xrange = (cur_xlim[1] - cur_xlim[0])*.5
609+
cur_yrange = (cur_ylim[1] - cur_ylim[0])*.5
610+
xdata = event.xdata # get event x location
611+
ydata = event.ydata # get event y location
612+
if event.button == 'up':
613+
# deal with zoom in
614+
scale_factor = 1 / self.base_scale
615+
elif event.button == 'down':
616+
# deal with zoom out
617+
scale_factor = self.base_scale
618+
else:
619+
# deal with something that should never happen
620+
scale_factor = 1
621+
# set new limits
622+
ax.set_xlim([xdata - cur_xrange*scale_factor,
623+
xdata + cur_xrange*scale_factor])
624+
ax.set_ylim([ydata - cur_yrange*scale_factor,
625+
ydata + cur_yrange*scale_factor])
626+
self.figure.canvas.draw() # force re-draw
627+
595628

596629
class ToolZoom(ZoomPanBase):
597630
"""Zoom to rectangle"""

0 commit comments

Comments
 (0)