如何将字典传入的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
相关产品推荐
相关产品推荐

