Matplotlib 事件选择器 - 在 class 中
Matplotlib event picker - Inside a class
我正在尝试将此 python 文档中显示的事件选择器示例插入到 class
中
http://matplotlib.org/users/event_handling.html
代码是这样的
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()
但是当鼠标点击一个点时出现这个错误。
AttributeError: 'MouseEvent' object has no attribute 'artist'
这可能是什么原因?
当不在 class 内时,代码可以完美运行
非常感谢
我怀疑代码是否在 class 之外工作。您在这里面临的问题是您使用了 'button_press_event'
,它没有 artist
属性。无论是在 class 之内还是之外,这都不会改变。
如果要使用 event.artist
,则需要使用 'pick_event'
。这显示在 matplotlib 页面的 event picking example 中。
如果要使用'button_press_event'
,则不能使用event.artist
,而是需要通过查询某个艺术家是否包含来找出被点击的元素事件,例如if line.contains(event)[0]: ...
。参见例如本题:
我正在尝试将此 python 文档中显示的事件选择器示例插入到 class
中http://matplotlib.org/users/event_handling.html
代码是这样的
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()
但是当鼠标点击一个点时出现这个错误。
AttributeError: 'MouseEvent' object has no attribute 'artist'
这可能是什么原因? 当不在 class 内时,代码可以完美运行
非常感谢
我怀疑代码是否在 class 之外工作。您在这里面临的问题是您使用了 'button_press_event'
,它没有 artist
属性。无论是在 class 之内还是之外,这都不会改变。
如果要使用
event.artist
,则需要使用'pick_event'
。这显示在 matplotlib 页面的 event picking example 中。如果要使用
'button_press_event'
,则不能使用event.artist
,而是需要通过查询某个艺术家是否包含来找出被点击的元素事件,例如if line.contains(event)[0]: ...
。参见例如本题: