I wrote the code to select the box area with the mouse on the plot of matplotlib and obtain the result (coordinates). To achieve this, we use a module called matplotlib.widgets. Of course, [sample code] [sample code] listed in matplotlib.org is fine, but since coordinates cannot be stored as it is, it is necessary to implement it as in the following class. I think there is. Also, I arranged it so that the colored box remains after the area is confirmed (in [Sample code] [sample code], the box disappears after confirmation).
rectselect.py
Import and use the following rectselect.py as a module. Since the release function is involved in arranging colored boxes, if you want to delete the box after confirmation, you can comment out the line related to release.
rectselect.py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from matplotlib.widgets import RectangleSelector
class RectSelect(object):
def __init__(self, ax=None):
self.ax = ax or plt.gca()
self.rect = Rectangle((0,0), 0, 0, color='orange', alpha=0.5)
self.ax.add_patch(self.rect)
self.blc = np.zeros(2)
self.trc = np.zeros(2)
def selector(event):
if event.key in ['Q', 'q'] and selector.RS.active:
print ('RectSelect deactivated.')
selector.RS.set_active(False)
if event.key in ['A', 'a'] and not selector.RS.active:
print ('RectSelect activated.')
selector.RS.set_active(True)
selector.RS = RectangleSelector(self.ax, self.callback)
self.ax.figure.canvas.mpl_connect('key_press_event', selector)
self.ax.figure.canvas.mpl_connect('button_release_event', self.release)
def callback(self, eclick, erelease):
x0, x1 = eclick.xdata, erelease.xdata
y0, y1 = eclick.ydata, erelease.ydata
self.blc = min(x0, x1), min(y0, y1)
self.trc = max(x0, x1), max(y0, y1)
blc_print = '({:0.4},{:0.4})'.format(*self.blc)
trc_print = '({:0.4},{:0.4})'.format(*self.trc)
print('blc={}, trc={}'.format(blc_print, trc_print))
def release(self, event):
self.rect.set_width(self.trc[0] - self.blc[0])
self.rect.set_height(self.trc[1] - self.blc[1])
self.rect.set_xy(self.blc)
self.ax.figure.canvas.draw()
In actual use, it works if you put a RectSelect instance just beforeplt.show (). You can also explicitly specify the target ʻaxes`. Below is the actual operation.
python
import numpy as np
import matplotlib.pyplot as plt
from rectselect import RectSelect
#Something plot
x = np.random.random(20) * 10
y = np.random.random(20) * 10
plt.plot(x,y,'.')
#Box selection
region = RectSelect()
plt.show()
#Bottom left of the box(blc)And upper right(trc)Show coordinates of
print(region.blc) # --> (2.338709677419355, 3.7239583333333335)
print(region.trc) # --> (8.4879032258064502, 8.671875)
The selected area is displayed surrounded by a line.

The selected area is filled and displayed.
