J'ai écrit le code pour sélectionner la zone de la boîte avec la souris sur le tracé de matplotlib
et obtenir le résultat (coordonnées). Pour y parvenir, nous utilisons un module appelé matplotlib.widgets
. Bien sûr, [exemple de code] [exemple de code] répertorié dans matplotlib.org convient, mais comme les coordonnées ne peuvent pas être stockées telles quelles, il est nécessaire de l'implémenter comme dans la classe suivante. Je pense que oui. De plus, je l'ai arrangé pour que la boîte colorée reste après la confirmation de la zone (dans [Exemple de code] [exemple de code], la boîte disparaît après confirmation).
rectselect.py
Importez et utilisez le rectselect.py
suivant comme module. Puisque la fonction release
est impliquée dans l'organisation des boîtes colorées, si vous souhaitez supprimer la boîte après confirmation, vous pouvez commenter la ligne liée à 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()
En utilisation réelle, cela fonctionne si vous mettez une instance RectSelect
juste avant plt.show ()
. Vous pouvez également spécifier explicitement les «axes» cibles. Vous trouverez ci-dessous l'opération réelle.
python
import numpy as np
import matplotlib.pyplot as plt
from rectselect import RectSelect
#Quelque chose d'intrigue
x = np.random.random(20) * 10
y = np.random.random(20) * 10
plt.plot(x,y,'.')
#Sélection de boîte
region = RectSelect()
plt.show()
#En bas à gauche de la boîte(blc)Et en haut à droite(trc)Afficher les coordonnées de
print(region.blc) # --> (2.338709677419355, 3.7239583333333335)
print(region.trc) # --> (8.4879032258064502, 8.671875)
La zone sélectionnée est affichée entourée d'une ligne.
La zone sélectionnée est remplie et affichée.