我有一堆时间序列数据,每5秒有一个点。因此,我可以创建一个线图,甚至平滑数据以获得更平滑的图。问题是,在matplotlib或python中有没有什么方法可以让我点击一个有效的点来做一些事情?例如,如果原始数据中存在该数据,我可以单击(10,75),然后我可以在Python中做一些事情。有什么想法吗谢谢。
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.plot?ax.scatter与ax.imshow?)。根据所选艺术家的不同,拾取事件将具有不同的属性。总是有event.artist和event.mouseevent。大多数艺术家都有自己的元素(例如Line2Ds、Collections等)将具有被选择为event.ind的项的索引列表。如果要绘制多边形并选择其中的点,请参见:http://matplotlib.org/examples/event_handling/lasso_demo.html#event-handling-example-code-lasso-demo-py
ax.plot
ax.scatter
ax.imshow
event.artist
event.mouseevent
Line2D
Collections
event.ind
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属性。
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]
3条答案
按热度按时间2nc8po8w1#
要扩展@tcaswell所说的内容,请参阅此处的文档:http://matplotlib.org/users/event_handling.html
但是,您可能会发现pick事件的快速演示很有用:
具体如何处理这一问题将取决于您使用的艺术家(换句话说,您使用的是
ax.plot
还是ax.plot
?ax.scatter
与ax.imshow
?)。根据所选艺术家的不同,拾取事件将具有不同的属性。总是有
event.artist
和event.mouseevent
。大多数艺术家都有自己的元素(例如Line2D
s、Collections
等)将具有被选择为event.ind
的项的索引列表。如果要绘制多边形并选择其中的点,请参见:http://matplotlib.org/examples/event_handling/lasso_demo.html#event-handling-example-code-lasso-demo-py
6qfn3psc2#
如果您想将额外的属性绑定到艺术家对象,例如,您正在绘制几部电影的IMDB评级,并且您希望通过单击其对应的电影的点来查看,您可以通过向您绘制的点添加自定义对象来实现此目的,如下所示:
现在,当您单击图上的某个点时,将打印相应对象的name属性。
xpszyzbs3#
关于问题中的“一堆”,我测试了拾取是否适用于双轴(否),多轴(是),多图形(是):
示例输出: