问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

使用Matplotlib实现3D图形的鼠标滚轮缩放功能

创作时间:
作者:
@小白创作中心

使用Matplotlib实现3D图形的鼠标滚轮缩放功能

引用
CSDN
1.
https://blog.csdn.net/schuberta/article/details/140928068

在使用Matplotlib绘制3D图形时,虽然默认支持通过鼠标拖拽变换视角,但缩放功能却需要通过工具栏按钮实现,不够便捷。本文将介绍如何通过捕捉鼠标滚轮事件,实现3D图形的动态缩放功能。

一 源代码

import numpy as np  
import matplotlib.pyplot as plt  
from mpl_toolkits.mplot3d import Axes3D  
  
# 创建一个新的figure  
fig = plt.figure()  
# 添加一个3d坐标轴  
ax = fig.add_subplot(111, projection='3d')  
  
# 定义数据  
X = np.linspace(-5, 5, 100)  
Y = np.linspace(-5, 5, 100)  
X, Y = np.meshgrid(X, Y)  
Z = np.sin(np.sqrt(X**2 + Y**2))  
  
# 绘制曲面图  
surf = ax.plot_surface(X, Y, Z, cmap='viridis')  
  
# 添加颜色条  
fig.colorbar(surf)  
  
# 设置坐标轴标签  
ax.set_xlabel('X Label')  
ax.set_ylabel('Y Label')  
ax.set_zlabel('Z Label')  
  
# 处理滚轮事件的函数  
def on_scroll(event):  
    if event.button == 'up':  
        factor = 1.25  
    elif event.button == 'down':  
        factor = 0.8  
    else:  
        factor = 1  
    ax.set_xlim3d(ax.get_xlim3d()[0] * factor, ax.get_xlim3d()[1] * factor)  
    ax.set_ylim3d(ax.get_ylim3d()[0] * factor, ax.get_ylim3d()[1] * factor)  
    ax.set_zlim3d(ax.get_zlim3d()[0] * factor, ax.get_zlim3d()[1] * factor)  
    plt.draw()  
  
# 连接滚轮事件  
fig.canvas.mpl_connect('scroll_event', on_scroll)  
  
# 显示图形  
plt.show()  

二 分析

以上代码中,核心是以下两行:

# 连接滚轮事件  
fig.canvas.mpl_connect('scroll_event', on_scroll)    
# 处理滚轮事件的函数  
def on_scroll(event):  
    if event.button == 'up':  
        factor = 1.25  
    elif event.button == 'down':  
        factor = 0.8  
    else:  
        factor = 1  
    ax.set_xlim3d(ax.get_xlim3d()[0] * factor, ax.get_xlim3d()[1] * factor)  
    ax.set_ylim3d(ax.get_ylim3d()[0] * factor, ax.get_ylim3d()[1] * factor)  
    ax.set_zlim3d(ax.get_zlim3d()[0] * factor, ax.get_zlim3d()[1] * factor)  
    plt.draw()    

这两部分代码分别用于捕捉鼠标滚轮事件,以及对事件的处理。当检测到滚轮向上滚动时,将图形放大25%;向下滚动时,缩小20%。通过这种方式,可以实现对3D图形的动态缩放,使交互体验更加友好。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号