matplotlib中无需点击即可获取鼠标坐标

rwb*_*ogl 11 python matplotlib

在 matplotlib 图中,如何在鼠标移动时连续读取鼠标的坐标,而不等待点击?这在matlab中是可能的,并且有一个mpld3 插件几乎可以完全满足我的要求,但我不知道如何实际访问它的坐标。还有包mpldatacursor,但这似乎需要点击。搜索“matplotlib鼠标坐标无需点击”之类的内容没有得到答案。

使用 mpld3 等附加包的答案很好,但似乎纯 matplotlib 解决方案应该是可能的。

rwb*_*ogl 13

这可以通过连接到matplotlib 文档中motion_notify_event简要提到的完成。每当鼠标移动时就会触发此事件,为回调函数提供一个MouseEvent可以使用的类。这个问题有一些相关的例子。

该类MouseEvent具有属性xyxdataydata。绘图中的 (x, y) 坐标由xdata和给出ydataxy以像素为单位。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()
Run Code Online (Sandbox Code Playgroud)


Mah*_*oud 7

解决办法很简单!当绘图上发生鼠标事件时,我们可以要求 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()
Run Code Online (Sandbox Code Playgroud)