2017-07-14 1 views
0

Je suis en train d'insérer l'exemple de sélecteur d'événement indiqué dans cette documentation python, dans une classesélecteur d'événement Matplotlib - A l'intérieur d'une classe

http://matplotlib.org/users/event_handling.html

Le code va comme ceci

import numpy as np 
import matplotlib.pyplot as plt 


class Test: 
    def __init__(self,line): 
     self.line = line 
     self.cidpress = self.line.figure.canvas.mpl_connect('button_press_event', self.onpick) 

    def onpick(self, event): 
     thisline = event.artist 
     xdata = thisline.get_xdata() 
     ydata = thisline.get_ydata() 
     ind = event.ind 
     points = tuple(zip(xdata[ind], ydata[ind])) 
     print('onpick points:', points) 


fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.set_title('click on points') 

line, = ax.plot(np.random.rand(10), 'o', picker=5) # 5 points tolerance 
a = Test(line) 

plt.show() 

Mais Im obtenir cette erreur lorsque la souris est cliquée sur un point.

AttributeError: 'MouseEvent' object has no attribute 'artist' 

Quelle pourrait être la raison de ce problème? Lorsqu'ils ne sont pas à l'intérieur de la classe le code fonctionne parfaitement

merci beaucoup

Répondre

-2

Je doute que le code fonctionne en dehors d'une classe. Le problème que vous rencontrez ici est que vous utilisez un 'button_press_event', qui n'a pas d'attribut artist. Cela ne changera pas si dans ou en dehors d'une classe.

  • Si vous voulez utiliser le event.artist vous auriez besoin d'utiliser un 'pick_event'. Ceci est illustré dans la page sur la page matplotlib.

  • Si vous souhaitez utiliser un 'button_press_event', vous ne pouvez pas utiliser event.artist mais auraient plutôt besoin de trouver l'élément qui a été cliqué sur en demandant si un artiste contient l'événement, par exemple if line.contains(event)[0]: .... Voir par exemple cette question: How to check if click is on scatter plot point with multiple markers (matplotlib)

+0

Merci @ImportanceOfBeingErnest. Fonctionne comme un charme. Je ne peux pas croire que j'ai passé toute la journée là-dessus. – ABCD