You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PyQt5 GUI中嵌入多个matplotlib 3D曲面图的实现方案

实现方案

核心思路

  • 先修改MatplotlibCanvas类,默认生成3D坐标轴,适配曲面图绘制需求
  • 为每个预留的QGraphicsView创建独立的MatplotlibCanvas实例,通过QGraphicsScene挂载到QGraphicsView中
  • 读取.mat文件拿到数据后,分别对四个canvas的坐标轴调用plot_surface绘图,刷新画布即可

具体修改代码

1. 修改MatplotlibCanvas类

class MatplotlibCanvas(FigureCanvasQTAgg):
    def __init__(self, parent=None, width = 5, height = 4, dpi = 120):
        fig = Figure(figsize = (width,height))
        # 修改为生成3D坐标轴
        self.axes = fig.add_subplot(111, projection='3d')
        super(MatplotlibCanvas,self).__init__(fig)
        fig.tight_layout()

2. 修改setupUi方法,初始化4个绘图区域

在setupUi中,原有self.canv和toolbar的代码替换为如下内容,为四个QGraphicsView分别挂载canvas:

self.filename = ''
        self.df = []
        # 初始化4个canvas,对应4个曲面图
        self.canvas_list = []
        self.scene_list = []
        self.gv_list = [self.graphicsView, self.graphicsView_2, self.graphicsView_3, self.graphicsView_4]
        for gv in self.gv_list:
            # 创建canvas和scene
            canvas = MatplotlibCanvas(self)
            scene = QtWidgets.QGraphicsScene()
            # 将canvas添加到scene
            proxy_widget = scene.addWidget(canvas)
            gv.setScene(scene)
            # 适配QGraphicsView大小
            gv.fitInView(proxy_widget, QtCore.Qt.KeepAspectRatio)
            # 存入列表方便后续调用
            self.canvas_list.append(canvas)
            self.scene_list.append(scene)

3. 修改readData方法,读取数据后绘图

你需要根据自己.mat文件内的实际结构取出4组对应pArray、rArray、绘图数组,分别赋值给四个canvas绘制:

def readData(self):
        self.df = mat73.loadmat(self.filename, use_attrdict=True)
        struct = self.df['DemoData']
        # 这里替换为你实际从struct中取出pArray、rArray、四个绘图数组的逻辑
        pArray = struct.p.data
        rArray = struct.r.data
        plot_datas = [struct.trArray.data, struct.tArray.data, struct.第三个曲面数组.data, struct.第四个曲面数组.data]
        # 遍历四个canvas绘图
        for idx, canvas in enumerate(self.canvas_list):
            # 清空原有绘图
            canvas.axes.clear()
            # 绘制曲面,参数可以按你的需求调整,比如叠加透明曲面
            surf = canvas.axes.plot_surface(pArray, rArray, plot_datas[idx], cmap='jet', alpha=1)
            # 可选添加坐标轴标签、标题等
            canvas.axes.set_title(f'曲面{idx+1}')
            # 刷新画布
            canvas.draw()

注意事项

  • 如果需要给每个曲面图添加matplotlib导航栏,可以仿照原有逻辑,为每个canvas单独创建NavigationToolbar2QT实例,放置在对应QGraphicsView旁边即可
  • 若绘图时出现尺寸不匹配的问题,可以在窗口resize事件中重新调用fitInView方法适配canvas大小
  • 每次绘图前必须调用axes.clear()清空上一次的绘图内容,避免叠加显示

内容的提问来源于stack exchange,提问作者user3794592

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:45:07