如何在交互式图中获取指向鼠标的 (x,y) 坐标(Python Matplotlib)?
在Python Matplotlib中,做出可交互式图表是一项很有用的技能。在制作交互式图表时,一个常见的需求是获取指向鼠标的 (x,y) 坐标。本文将介绍如何在Python Matplotlib中获得指向鼠标的坐标。
Matplotlib交互式图表
Matplotlib提供了许多创建交互式图表的选项。我们将重点讨论pyplot
中的两个很常用的类: FigureCanvas
和 NavigationToolbar2
.
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)坐标,然后使用这些坐标进行任何图表上的操作。