@@ -572,6 +572,8 @@ def __init__(self, *args):
572
572
self ._xypress = None
573
573
self ._idPress = None
574
574
self ._idRelease = None
575
+ self ._idScroll = None
576
+ self .base_scale = 2.
575
577
576
578
def enable (self , event ):
577
579
"""Connect press/release events and lock the canvas"""
@@ -580,18 +582,49 @@ def enable(self, event):
580
582
'button_press_event' , self ._press )
581
583
self ._idRelease = self .figure .canvas .mpl_connect (
582
584
'button_release_event' , self ._release )
585
+ self ._idScroll = self .figure .canvas .mpl_connect (
586
+ 'scroll_event' , self .scroll_zoom )
583
587
584
588
def disable (self , event ):
585
589
"""Release the canvas and disconnect press/release events"""
586
590
self ._cancel_action ()
587
591
self .figure .canvas .widgetlock .release (self )
588
592
self .figure .canvas .mpl_disconnect (self ._idPress )
589
593
self .figure .canvas .mpl_disconnect (self ._idRelease )
594
+ self .figure .canvas .mpl_disconnect (self ._idScroll )
590
595
591
596
def trigger (self , sender , event , data = None ):
592
597
self .navigation .get_tool ('viewpos' ).add_figure ()
593
598
ToolToggleBase .trigger (self , sender , event , data )
594
599
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
+
595
628
596
629
class ToolZoom (ZoomPanBase ):
597
630
"""Zoom to rectangle"""
0 commit comments