import matplotlib.pyplot as plt
import numpy as np
import mplcursors
# 滚轮放缩
def on_scroll(event):
"""定义鼠标滚轮事件处理函数"""
base_scale = 1.1
xdata = event.xdata # 鼠标在x轴上的坐标
ydata = event.ydata # 鼠标在y轴上的坐标
if event.button == 'up':
# 向上滚动鼠标滚轮
scale_factor = 1/base_scale
elif event.button == 'down':
# 向下滚动鼠标滚轮
scale_factor = base_scale
else:
# 不处理其他滚轮事件
return
# 获取当前坐标系的缩放比例
current_xlim = ax.get_xlim()
current_ylim = ax.get_ylim()
x_range = current_xlim[1] - current_xlim[0]
y_range = current_ylim[1] - current_ylim[0]
# 计算新的缩放比例
new_x_range = x_range*scale_factor
new_y_range = y_range*scale_factor
# 计算缩放后的坐标范围
new_xlim = xdata - (xdata - current_xlim[0])*new_x_range/x_range, \
xdata + (current_xlim[1] - xdata)*new_x_range/x_range
new_ylim = ydata - (ydata - current_ylim[0])*new_y_range/y_range, \
ydata + (current_ylim[1] - ydata)*new_y_range/y_range
# 更新坐标轴范围
ax.set_xlim(new_xlim)
ax.set_ylim(new_ylim)
# 重新绘制图形
fig.canvas.draw_idle()
# 悬停事件处理函数
def on_hover(sel):
ind = sel.index
x_val = sel.target[0]
y_val = sel.target[1]
label = sel.artist.get_label()
# 将悬停的点坐标打印到控制台上
# print(f"在{label}上的点 ({x_val:.2f}, {y_val:.2f})")
# 生成随机数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 创建图形和子图
fig, ax = plt.subplots()
# 绘制曲线
line1=ax.plot(x, y)
# 使用 mplcursors 注册悬停事件处理函数
mplcursors.cursor(line1,hover=True).connect("add", on_hover)
# 连接鼠标滚轮事件处理函数
fig.canvas.mpl_connect('scroll_event', on_scroll)
# 显示图形
plt.show()
结果:(在曲线上的所有数据点上都会显示)
若只查看画图所使用的点,可以加个散点图然后对其使用悬停功能,如下s1。
import matplotlib.pyplot as plt
import numpy as np
import mplcursors
# 滚轮放缩
def on_scroll(event):
"""定义鼠标滚轮事件处理函数"""
base_scale = 1.1
xdata = event.xdata # 鼠标在x轴上的坐标
ydata = event.ydata # 鼠标在y轴上的坐标
if event.button == 'up':
# 向上滚动鼠标滚轮
scale_factor = 1/base_scale
elif event.button == 'down':
# 向下滚动鼠标滚轮
scale_factor = base_scale
else:
# 不处理其他滚轮事件
return
# 获取当前坐标系的缩放比例
current_xlim = ax.get_xlim()
current_ylim = ax.get_ylim()
x_range = current_xlim[1] - current_xlim[0]
y_range = current_ylim[1] - current_ylim[0]
# 计算新的缩放比例
new_x_range = x_range*scale_factor
new_y_range = y_range*scale_factor
# 计算缩放后的坐标范围
new_xlim = xdata - (xdata - current_xlim[0])*new_x_range/x_range, \
xdata + (current_xlim[1] - xdata)*new_x_range/x_range
new_ylim = ydata - (ydata - current_ylim[0])*new_y_range/y_range, \
ydata + (current_ylim[1] - ydata)*new_y_range/y_range
# 更新坐标轴范围
ax.set_xlim(new_xlim)
ax.set_ylim(new_ylim)
# 重新绘制图形
fig.canvas.draw_idle()
# 悬停事件处理函数
def on_hover(sel):
ind = sel.index
x_val = sel.target[0]
y_val = sel.target[1]
label = sel.artist.get_label()
# 将悬停的点坐标打印到控制台上
# print(f"在{label}上的点 ({x_val:.2f}, {y_val:.2f})")
# 生成随机数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 创建图形和子图
fig, ax = plt.subplots()
# 绘制曲线
ax.plot(x, y)
s1=ax.scatter(x, y)
# 使用 mplcursors 注册悬停事件处理函数
mplcursors.cursor(s1,hover=True).connect("add", on_hover)
# 连接鼠标滚轮事件处理函数
fig.canvas.mpl_connect('scroll_event', on_scroll)
# 显示图形
plt.show()
结果:(只会在绘图所用的数据点上显示)
参考: