Matplotlib / python可点击点

ac1kyiln  于 2023-05-18  发布在  Python
关注(0)|答案(3)|浏览(114)

我有一堆时间序列数据,每5秒有一个点。因此,我可以创建一个线图,甚至平滑数据以获得更平滑的图。问题是,在matplotlib或python中有没有什么方法可以让我点击一个有效的点来做一些事情?例如,如果原始数据中存在该数据,我可以单击(10,75),然后我可以在Python中做一些事情。
有什么想法吗谢谢。

2nc8po8w

2nc8po8w1#

要扩展@tcaswell所说的内容,请参阅此处的文档:http://matplotlib.org/users/event_handling.html
但是,您可能会发现pick事件的快速演示很有用:

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还是ax.plotax.scatterax.imshow?)。
根据所选艺术家的不同,拾取事件将具有不同的属性。总是有event.artistevent.mouseevent。大多数艺术家都有自己的元素(例如Line2Ds、Collections等)将具有被选择为event.ind的项的索引列表。
如果要绘制多边形并选择其中的点,请参见:http://matplotlib.org/examples/event_handling/lasso_demo.html#event-handling-example-code-lasso-demo-py

6qfn3psc

6qfn3psc2#

如果您想将额外的属性绑定到艺术家对象,例如,您正在绘制几部电影的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属性。

xpszyzbs

xpszyzbs3#

关于问题中的“一堆”,我测试了拾取是否适用于双轴(否),多轴(是),多图形(是):

import numpy as np
from matplotlib.pyplot import subplots

def on_pick(e):
    print(e.artist.s, e.ind)

x = np.linspace(0, np.pi)

fig, ax = subplots(2)
ax[0].plot(x, np.cos(x), picker=5)[0].s = 'cos'
ax[1].plot(x, np.sin(x), picker=5)[0].s = 'sin'
fig.canvas.callbacks.connect('pick_event', on_pick)
fig.tight_layout()
fig.show()

fig, ax0 = subplots()
ax0.plot(x, np.tan(x), picker=5)[0].s = 'tan' # Won't work, masked by ax1.
ax0.set_ylim(-3, 3)
ax1 = ax0.twinx()
ax1.plot(x, np.sqrt(x), picker=5)[0].s = 'sqrt'
fig.canvas.callbacks.connect('pick_event', on_pick)
fig.tight_layout()
fig.show()

示例输出:

cos [6]
sin [32]
sqrt [30]

相关问题