首页 > 解决方案 > 无需点击matplotlib即可获取鼠标坐标

问题描述

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

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

标签: pythonmatplotlib

解决方案


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

该类MouseEvent具有属性xyxdataydata。就您的绘图而言, (x, y) 坐标由xdata和给出ydatax并且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()

推荐阅读