在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
相关产品推荐
相关产品推荐

