如何在交互式图中获取指向鼠标的 (x,y) 坐标(Python Matplotlib)?

如何在交互式图中获取指向鼠标的 (x,y) 坐标(Python Matplotlib)?

Python Matplotlib中,做出可交互式图表是一项很有用的技能。在制作交互式图表时,一个常见的需求是获取指向鼠标的 (x,y) 坐标。本文将介绍如何在Python Matplotlib中获得指向鼠标的坐标。

Matplotlib交互式图表

Matplotlib提供了许多创建交互式图表的选项。我们将重点讨论pyplot中的两个很常用的类: FigureCanvasNavigationToolbar2.

FigureCanvas 类是matplotlib中所有图表的父类,它实现了渲染图表并传递绘图指令的基础操作。要在UI上拥有交互功能,我们需要在FigureCanvas中嵌入PyQt5,PyGTK或Tkinter等Python GUI框架。

NavigationToolbar2 类实现了与图表交互所需的工具条和按钮。它提供了放大,移动和旋转图表的标准操作。

我们可以使用以下代码在不同的GUI框架中创建交互式图表:

# 使用Tkinter创建一个图表和工具条
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk

import tkinter as tk

root = tk.Tk()

fig = plt.figure(figsize=(5, 4), dpi=100)
ax = fig.add_subplot(1, 1, 1)

t = [0, 1, 2, 3, 4, 5]
s = [0, 1, 0.5, 2, 1.5, 3]

ax.plot(t, s)

canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()

toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()

canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)

tk.mainloop()

在交互式图表中获取鼠标位置

对于Matplotlib的FigureCanvas类,我们可以使用以下代码来获取交互式图表中指向鼠标的 (x,y) 坐标:

fig.canvas.mpl_connect('motion_notify_event', on_mouse_move)

def on_mouse_move(event):
    if event.inaxes:
        x = event.xdata
        y = event.ydata
        print(f'x={x}, y={y}')

在这个例子中,我们连接了motion_notify_event事件并执行了on_mouse_move函数。当不断移动鼠标时,事件会在每次鼠标移动时触发。

on_mouse_move函数检查当前事件是否在Axes对象中发生,如果是,则提取出当前点的(x,y)坐标,并用print语句将它们打印出来。

我们还可以将这些坐标用于其他的一些操作,例如更新交互式图表中的数据或在图表上添加注释。下面是一个完整的示例程序:

# 使用Tkinter创建一个图表和工具条,并输出鼠标坐标
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk

import tkinter as tk

root = tk.Tk()

fig = plt.figure(figsize=(5, 4), dpi=100)
ax = fig.add_subplot(1, 1, 1)

t = [0, 1, 2, 3, 4, 5]
s = [0, 1, 0.5, 2, 1.5, 3]

ax.plot(t, s)

# 定义鼠标移动事件处理程序
def on_mouse_move(event):
    if event.inaxes:
        x, y = event.xdata, event.ydata
        ax.format_coord = lambda x,y: f'x={x:.2f}, y={y:.2f}'
        ax.annotate(f'({x:.2f},{y:.2f})', (x,y), textcoords='offset points', xytext=(0,10), ha='center')
        plt.draw()

# 连接鼠标移动事件
fig.canvas.mpl_connect('motion_notify_event', on_mouse_move)

# 创建图表和工具条,并将其嵌入到Tkinter窗口
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()

toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()

canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)

tk.mainloop()

在上面的代码中,我们定义了一个新的on_mouse_move函数,它使用annotate方法向鼠标指向的点添加了一个文本标注。此标注显示了当前鼠标位置的(x, y)坐标。使用draw方法在图表中显示标注。

最后,我们通过连接motion_notify_event事件来将on_mouse_move函数绑定到交互式图表实例中。

结论

在Matplotlib中获取指向鼠标的 (x,y) 坐标非常有用,以便进行一些交互操作,例如更新数据或添加注释。通过连接motion_notify_event事件,我们可以使用自定义的处理程序来获得鼠标位置,并在交互式图表中执行任何操作。在使用这种技术时,我们需要连接鼠标事件并获取当前鼠标的(x,y)坐标,然后使用这些坐标进行任何图表上的操作。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程