无需单击matplotlib即可获取鼠标坐标

时间:2018-07-15 15:57:39

标签: python matplotlib

在matplotlib图中,如何在移动鼠标时连续读取鼠标坐标,而又不等待点击?这在matlab中是可能的,并且有mpld3 plugin几乎可以完全执行我想要的操作,但是我看不到如何实际从中访问。也有mpldatacursor软件包,但这似乎需要点击。搜索“ matplotlib鼠标坐标而不单击”之类的内容不会产生答案。

使用诸如mpld3之类的其他软件包的答案很好,但似乎应该可以使用纯matplotlib解决方案。

2 个答案:

答案 0 :(得分:1)

解决方案非常简单!每当情节发生鼠标事件时,我们都可以要求matplotlib通知我们。 为此,我们需要指定三件事:

  • 我们对哪个鼠标事件感兴趣? (这里我们对鼠标移动感兴趣,而不是例如单击)view supported events
  • 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类具有属性xyxdataydata。 (x,y)坐标根据您的图由xdataydata给出; xy以像素为单位。 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()