""" ================== Rectangle Selector ================== Do a mouseclick somewhere, move the mouse to some destination, release the button. This class gives click- and release-events and also draws a line or a box from the click-point to the actual mouseposition (within the same axes) until the button is released. Within the method ``self.ignore()`` it is checked whether the button from eventpress and eventrelease are the same. """ from matplotlib.widgets import RectangleSelector import numpy as np import matplotlib.pyplot as plt def line_select_callback(eclick, erelease): """ Callback for line selection. *eclick* and *erelease* are the press and release events. """ x1, y1 = eclick.xdata, eclick.ydata x2, y2 = erelease.xdata, erelease.ydata print(f"({x1:3.2f}, {y1:3.2f}) --> ({x2:3.2f}, {y2:3.2f})") print(f" The buttons you used were: {eclick.button} {erelease.button}") def toggle_selector(event): print(' Key pressed.') if event.key == 't': if toggle_selector.RS.active: print(' RectangleSelector deactivated.') toggle_selector.RS.set_active(False) else: print(' RectangleSelector activated.') toggle_selector.RS.set_active(True) fig, ax = plt.subplots() N = 100000 # If N is large one can see improvement by using blitting. x = np.linspace(0, 10, N) ax.plot(x, np.sin(2*np.pi*x)) # plot something ax.set_title( "Click and drag to draw a rectangle.\n" "Press 't' to toggle the selector on and off.") # drawtype is 'box' or 'line' or 'none' toggle_selector.RS = RectangleSelector(ax, line_select_callback, drawtype='box', useblit=True, button=[1, 3], # disable middle button minspanx=5, minspany=5, spancoords='pixels', interactive=True) fig.canvas.mpl_connect('key_press_event', toggle_selector) plt.show()