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

如何将字典传入的Seaborn图表嵌入PyQt5 Designer创建的QWidget中

实现Seaborn图表嵌入PyQt5自定义QWidget的方案

1. 导入必需依赖

在你的UI代码文件头部添加以下导入语句,提前指定Matplotlib的Qt后端避免渲染冲突:

from PyQt5 import QtCore, QtGui, QtWidgets
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib
# 设置Matplotlib使用Qt5后端,必须放在import pyplot之前执行
matplotlib.use("Qt5Agg")

2. 新增图表嵌入通用函数

在Ui_MainWindow类中新增一个可复用的嵌入函数,避免重复写三次嵌入逻辑:

def add_figure_to_widget(self, target_widget, figure):
    # 清空目标控件原有内容
    for child in target_widget.children():
        child.deleteLater()
    # 为目标控件创建垂直布局
    layout = QtWidgets.QVBoxLayout(target_widget)
    layout.setContentsMargins(0,0,0,0) # 去掉边距让图表撑满控件
    # 基于matplotlib的Figure对象创建绘图画布
    canvas = FigureCanvas(figure)
    # 可选:添加Matplotlib交互工具栏,支持缩放、保存图片等功能
    # toolbar = NavigationToolbar(canvas, target_widget)
    # layout.addWidget(toolbar)
    # 将画布添加到布局中
    layout.addWidget(canvas)
    canvas.draw()

3. 在UI初始化逻辑中调用嵌入函数

修改setupUi方法,在所有控件初始化完成后、connectSlotsByName执行前,分别嵌入三个图表:

def setupUi(self, MainWindow):
    glycerate_PT_Graphs = glycerate_PT.get_PT() #获取图表字典
    fig1 = glycerate_PT_Graphs['Level 1'] 
    fig2 = glycerate_PT_Graphs['Level 2']
    fig3 = glycerate_PT_Graphs['Level 3']

    # 原有控件初始化逻辑保持不变
    MainWindow.setObjectName("MainWindow")
    MainWindow.resize(1150, 771)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.Level1 = QtWidgets.QWidget(self.centralwidget)
    self.Level1.setGeometry(QtCore.QRect(520, 90, 241, 131))
    self.Level1.setObjectName("Level1")
    self.Level2 = QtWidgets.QWidget(self.centralwidget)
    self.Level2.setGeometry(QtCore.QRect(520, 250, 241, 121))
    self.Level2.setObjectName("Level2")
    self.Level3 = QtWidgets.QWidget(self.centralwidget)
    self.Level3.setGeometry(QtCore.QRect(520, 390, 241, 131))
    self.Level3.setObjectName("Level3")
    MainWindow.setCentralWidget(self.centralwidget)
    self.menubar = QtWidgets.QMenuBar(MainWindow)
    self.menubar.setGeometry(QtCore.QRect(0, 0, 1150, 20))
    self.menubar.setObjectName("menubar")
    MainWindow.setMenuBar(self.menubar)
    self.statusbar = QtWidgets.QStatusBar(MainWindow)
    self.statusbar.setObjectName("statusbar")
    MainWindow.setStatusBar(self.statusbar)

    self.retranslateUi(MainWindow)

    # =====新增:嵌入三个图表到对应控件=====
    self.add_figure_to_widget(self.Level1, fig1)
    self.add_figure_to_widget(self.Level2, fig2)
    self.add_figure_to_widget(self.Level3, fig3)

    QtCore.QMetaObject.connectSlotsByName(MainWindow)

可选优化项

如果图表显示裁剪、字体过大,可以在生成Seaborn图表的时候调整画布尺寸和DPI,匹配你给QWidget设置的大小:

def graph_PrecisionTotal(self, key, df):
    sns.set_style('darkgrid')
    # 调整figsize和dpi适配QWidget的240*130左右的尺寸
    fig, ax = plt.subplots(figsize=(2.4, 1.3), dpi=100)
    ax = sns.boxplot(x='Date', y='Calculated Concentration', data=df, width=0.2, whis=10)
    ax.set_title(str(self.analyte_name) + ' ' + key)
    # 可选:调整x轴标签倾斜避免重叠
    plt.xticks(rotation=30, ha='right')
    fig.tight_layout() # 自动调整布局避免内容裁剪
    self.QCgraphs[key] = fig

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:21:02