python画图实现滚轮放缩zoom和鼠标悬停察看数据点交互式功能

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()

结果:(只会在绘图所用的数据点上显示)


参考:

matplotlib交互式数据光标实现——mplcursors-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>