Matplotlib/python可点击点

Matplotlib/python可点击点,python,graph,matplotlib,plot,Python,Graph,Matplotlib,Plot,我有一组时间序列数据,每5秒有一个点。因此,我可以创建一个直线图,甚至平滑数据,以获得一个更平滑的图。问题是,在matplotlib或python中是否有任何方法允许我单击有效点来执行某些操作?例如,如果原始数据中存在数据,我可以点击(10,75),然后我就可以用Python做一些事情 有什么想法吗?谢谢。要扩展@tcaswell所说的内容,请参阅此处的文档: 但是,您可能会发现拾取事件的快速演示非常有用: import matplotlib.pyplot as plt def on_pick

我有一组时间序列数据,每5秒有一个点。因此,我可以创建一个直线图,甚至平滑数据,以获得一个更平滑的图。问题是,在matplotlib或python中是否有任何方法允许我单击有效点来执行某些操作?例如,如果原始数据中存在数据,我可以点击(10,75),然后我就可以用Python做一些事情


有什么想法吗?谢谢。

要扩展@tcaswell所说的内容,请参阅此处的文档:

但是,您可能会发现拾取事件的快速演示非常有用:

import matplotlib.pyplot as plt

def on_pick(event):
    artist = event.artist
    xmouse, ymouse = event.mouseevent.xdata, event.mouseevent.ydata
    x, y = artist.get_xdata(), artist.get_ydata()
    ind = event.ind
    print 'Artist picked:', event.artist
    print '{} vertices picked'.format(len(ind))
    print 'Pick between vertices {} and {}'.format(min(ind), max(ind)+1)
    print 'x, y of mouse: {:.2f},{:.2f}'.format(xmouse, ymouse)
    print 'Data point:', x[ind[0]], y[ind[0]]
    print

fig, ax = plt.subplots()

tolerance = 10 # points
ax.plot(range(10), 'ro-', picker=tolerance)

fig.canvas.callbacks.connect('pick_event', on_pick)

plt.show()
具体如何处理这一点取决于您使用的艺术家(换句话说,您是否使用了
ax.plot
vs.
ax.scatter
vs.
ax.imshow
?)

拾取事件将具有不同的属性,具体取决于选定的艺术家。始终会有
event.artist
event.mouseevent
。大多数具有单个元素(例如
Line2D
s、
Collections
等)的艺术家都会有一个被选为
event.ind
的项目索引列表


如果要绘制多边形并选择内部点,请参见:

如果要将额外属性绑定到艺术家对象,例如,您正在绘制多部电影的IMDB分级,并且希望通过单击电影对应的点来查看,可以通过将自定义对象添加到所绘制的点来执行此操作,像这样:

import matplotlib.pyplot as plt

class custom_objects_to_plot:
    def __init__(self, x, y, name):
        self.x = x
        self.y = y
        self.name = name

a = custom_objects_to_plot(10, 20, "a")
b = custom_objects_to_plot(30, 5, "b")
c = custom_objects_to_plot(40, 30, "c")
d = custom_objects_to_plot(120, 10, "d")

def on_pick(event):
    print(event.artist.obj.name)

fig, ax = plt.subplots()
for obj in [a, b, c, d]:
    artist = ax.plot(obj.x, obj.y, 'ro', picker=5)[0]
    artist.obj = obj

fig.canvas.callbacks.connect('pick_event', on_pick)

plt.show()

现在,当您单击绘图上的一个点时,将打印相应对象的name属性。

是的,请参阅选择器演示。我收到以下错误:x,y=Artister.get\u xdata(),Artister.get\u ydata()AttributeError:“PathCollection”对象没有属性“get\u xdata”