Matplotlib: dessiner une zone de sélection sous la forme d'un rectangle avec la souris
Je veux être en mesure de tracer une zone de sélection sur un matplotlib de terrain avec un événement de souris. Je n'ai pas trouvé d'informations sur la façon de le faire avec python.
En fin de compte, je veux être en mesure de tracer une région d'intérêt avec ma souris sur une carte créée avec matplotlib fond de carte et récupérer le coin coordonnées.
Quelqu'un a une idée, par exemple, les références?
Merci,
Greg
class Annotate(object):
def __init__(self):
self.ax = plt.gca()
self.rect = Rectangle((0,0), 1, 1, facecolor='None', edgecolor='green')
self.x0 = None
self.y0 = None
self.x1 = None
self.y1 = None
self.ax.add_patch(self.rect)
self.ax.figure.canvas.mpl_connect('button_press_event', self.on_press)
self.ax.figure.canvas.mpl_connect('button_release_event', self.on_release)
self.ax.figure.canvas.mpl_connect('motion_notify_event', self.on_motion)
def on_press(self, event):
print 'press'
self.x0 = event.xdata
self.y0 = event.ydata
self.x1 = event.xdata
self.y1 = event.ydata
self.rect.set_width(self.x1 - self.x0)
self.rect.set_height(self.y1 - self.y0)
self.rect.set_xy((self.x0, self.y0))
self.rect.set_linestyle('dashed')
self.ax.figure.canvas.draw()
def on_motion(self,event):
if self.on_press is True:
return
self.x1 = event.xdata
self.y1 = event.ydata
self.rect.set_width(self.x1 - self.x0)
self.rect.set_height(self.y1 - self.y0)
self.rect.set_xy((self.x0, self.y0))
self.rect.set_linestyle('dashed')
self.ax.figure.canvas.draw()
def on_release(self, event):
print 'release'
self.x1 = event.xdata
self.y1 = event.ydata
self.rect.set_width(self.x1 - self.x0)
self.rect.set_height(self.y1 - self.y0)
self.rect.set_xy((self.x0, self.y0))
self.rect.set_linestyle('solid')
self.ax.figure.canvas.draw()
print self.x0,self.x1,self.y0,self.y1
return [self.x0,self.x1,self.y0,self.y1]
OriginalL'auteur leroygr | 2012-08-21
Vous devez vous connecter pour publier un commentaire.
Matplotlib fournit sa propre
RectangleSelector
. Il est un exemple sur le matplotlib page, que vous pouvez adapter à vos besoins.Une version simplifiée devrait ressembler à quelque chose comme ceci:
OriginalL'auteur ImportanceOfBeingErnest
Voici un petit exemple qui montre comment utiliser la souris pour dessiner un rectangle sur un matplotlib de la parcelle.
Si vous voulez mettre à jour le dessin comme vous déplacez la souris, vous voulez ajouter la ligne
self.ax.figure.canvas.mpl_connect('motion_notify_event', self.on_motion)
et de définir une méthode on_motion qui fait ce que vous voulez. Voir matplotlib.sourceforge.net/examples/event_handling/index.html. Pour voir ce rectangle des propriétés que vous pouvez modifier, voir matplotlib.sourceforge.net/api/...Merci beaucoup! Des acclamations.
J'ai presque réussi! Mais j'ai encore un problème: le rectangle est dessiné sur le coup, mais je veux qu'il soit établi au cours de on_press+on_motion événements. Voir mon nouveau code dans la question d'origine. Merci.
Définir une valeur de type boolean is_pressed attribut de vrai à l'intérieur de on_press, affectez la valeur false dans on_release, et seulement dessiner le rectangle si l'auto.is_pressed == True (note de votre test d'auto.on_press n'a pas de sens, parce que vous êtes à tester si une méthode est Vrai)
OriginalL'auteur ChrisB