From a30c155b8da3c59ebb1406725253b2a790de9529 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Fri, 28 May 2021 00:11:25 +0200 Subject: [PATCH] Support panning and zooming using mouse scroll wheel --- lib/matplotlib/backend_bases.py | 39 +++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 8574398cfd6e..0ade438d2641 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -2688,6 +2688,42 @@ def button_press_handler(event, canvas=None, toolbar=None): toolbar.forward() +def scroll_handler(event, canvas=None, toolbar=None): + ax = event.inaxes + if ax is None: + return + + if toolbar is None: + if canvas is None: + canvas = event.canvas + toolbar = canvas.toolbar + + if toolbar is None or toolbar.mode == _Mode.NONE: + return + + if event.key is None: # vertical scroll + toolbar.push_current() + ymin, ymax = ax.get_ylim() + delta = 0.05 * event.step * (ymax - ymin) + ax.set_ylim(ymin + delta, ymax + delta) + ax.figure.canvas.draw_idle() + elif event.key == 'shift': # horizontal scroll + toolbar.push_current() + xmin, xmax = ax.get_xlim() + delta = 0.05 * event.step * (xmax - xmin) + ax.set_xlim(xmin + delta, xmax + delta) + ax.figure.canvas.draw_idle() + elif event.key == 'control': # zoom + toolbar.push_current() + xmin, xmax = ax.get_xlim() + delta = 0.05 * event.step * (xmax - xmin) + ax.set_xlim(xmin + delta, xmax - delta) + ymin, ymax = ax.get_ylim() + delta = 0.05 * event.step * (ymax - ymin) + ax.set_ylim(ymin + delta, ymax - delta) + ax.figure.canvas.draw_idle() + + class NonGuiException(Exception): """Raised when trying show a figure in a non-GUI backend.""" pass @@ -2760,11 +2796,14 @@ def __init__(self, canvas, num): self.key_press_handler_id = None self.button_press_handler_id = None + self.scroll_handler_id = None if rcParams['toolbar'] != 'toolmanager': self.key_press_handler_id = self.canvas.mpl_connect( 'key_press_event', key_press_handler) self.button_press_handler_id = self.canvas.mpl_connect( 'button_press_event', button_press_handler) + self.scroll_handler_id = self.canvas.mpl_connect( + 'scroll_event', scroll_handler) self.toolmanager = (ToolManager(canvas.figure) if mpl.rcParams['toolbar'] == 'toolmanager'