在matplotlib图中,如何在移动鼠标时连续读取鼠标坐标,而又不等待点击?这在matlab中是可能的,并且有mpld3 plugin几乎可以完全执行我想要的操作,但是我看不到如何实际从中访问。也有mpldatacursor软件包,但这似乎需要点击。搜索“ matplotlib鼠标坐标而不单击”之类的内容不会产生答案。
使用诸如mpld3之类的其他软件包的答案很好,但似乎应该可以使用纯matplotlib解决方案。
答案 0 :(得分:1)
解决方案非常简单!每当情节发生鼠标事件时,我们都可以要求matplotlib通知我们。 为此,我们需要指定三件事:
matplotlib应该在哪里发送事件数据? (这里我们定义了一个接收数据的函数。名称是任意的,可以是任何东西)
将事件和函数的名称传递给matplotlib(我们将其传递给.connect方法。)
就这么简单!
def on_mouse_move(event):
print('Event received:',event.x,event.y)
image= #your image
plt.imshow(image)
plt.connect('motion_notify_event',on_mouse_move)
plt.show()
答案 1 :(得分:0)
这可以通过连接到motion_notify_event
(在matplotlib文档中简要提到here)来完成。每当鼠标移动时,都会触发此事件,从而为回调函数提供一个MouseEvent
类来使用。 This question有一些相关示例。
MouseEvent
类具有属性x
,y
,xdata
和ydata
。 (x,y)坐标根据您的图由xdata
和ydata
给出; x
和y
以像素为单位。 matplotlib文档中的cursor_demo.py提供了一个示例。
这是一个很小的例子:
import matplotlib.pyplot as plt
import numpy as np
def plot_unit_circle():
angs = np.linspace(0, 2 * np.pi, 10**6)
rs = np.zeros_like(angs) + 1
xs = rs * np.cos(angs)
ys = rs * np.sin(angs)
plt.plot(xs, ys)
def mouse_move(event):
x, y = event.xdata, event.ydata
print(x, y)
plt.connect('motion_notify_event', mouse_move)
plot_unit_circle()
plt.axis('equal')
plt.show()