matplotlib 3.5.1

>>> """
===============================
Rectangle and ellipse selectors
===============================

Click somewhere, move the mouse, and release the mouse button.
`.RectangleSelector` and `.EllipseSelector` draw a rectangle or an ellipse
from the initial click position to the current mouse position (within the same
axes) until the button is released.  A connected callback receives the click-
and release-events.
"""
... 
... from matplotlib.widgets import EllipseSelector, RectangleSelector
... import numpy as np
... import matplotlib.pyplot as plt
... 
... 
... def 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':
...  for selector in selectors:
...  name = type(selector).__name__
...  if selector.active:
...  print(f'{name} deactivated.')
...  selector.set_active(False)
...  else:
...  print(f'{name} activated.')
...  selector.set_active(True)
... 
... 
... fig = plt.figure(constrained_layout=True)
... axs = fig.subplots(2)
... 
... N = 100000 # If N is large one can see improvement by using blitting.
... x = np.linspace(0, 10, N)
... 
... selectors = []
... for ax, selector_class in zip(axs, [RectangleSelector, EllipseSelector]):
...  ax.plot(x, np.sin(2*np.pi*x)) # plot something
...  ax.set_title(f"Click and drag to draw a {selector_class.__name__}.")
...  selectors.append(selector_class(
...  ax, select_callback,
...  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)
... axs[0].set_title("Press 't' to toggle the selectors on and off.\n"
...  + axs[0].get_title())
... plt.show()
... 
... #############################################################################
... #
... # .. admonition:: References
... #
... # The use of the following functions, methods, classes and modules is shown
... # in this example:
... #
... # - `matplotlib.widgets.RectangleSelector`
... # - `matplotlib.widgets.EllipseSelector`
...