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

基于PyQt5与pyqtgraph构建双图表的技术实现问询

我懂你现在的困扰啦——想基于PyQt5和pyqtgraph做一个带两个相同图表的应用,还希望通过类的分层来管理代码(把重复图表封装到一个类,再统一放到容器类,最后整合到主窗口),之前用PlotWidget、GraphicsWindow这些组件时卡壳了对吧?我给你整理了一套清晰的实现方案,代码结构清晰,还方便后续维护:

核心实现思路

我们把代码分成三层结构,让逻辑更清晰:

  1. 自定义图表类:把所有相同图表的配置、数据绘制逻辑封装在这里,确保每个实例都是一模一样的图表
  2. 容器类:专门用来承载两个自定义图表,用布局管理它们的排列方式
  3. 主窗口类:把容器类作为QMainWindow的中心部件,完成整个应用的整合
完整代码示例
import sys
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QApplication, QMainWindow, QHBoxLayout)
import pyqtgraph as pg
import numpy as np

# 1. 封装重复的图表逻辑:所有相同图表的配置都在这里
class MyPlotWidget(pg.PlotWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        # 设置通用样式
        self.setLabel('left', 'Y 轴')
        self.setLabel('bottom', 'X 轴')
        self.setTitle('示例图表')
        self.showGrid(x=True, y=True)
        # 生成示例数据(你可以替换成自己的业务数据)
        x_data = np.linspace(0, 10, 100)
        y_data = np.sin(x_data) + np.cos(x_data)
        # 绘制曲线
        self.plot(x_data, y_data, pen='darkcyan', width=2, name='sin+cos')

# 2. 容器类:承载两个相同的图表,管理它们的布局
class PlotContainerWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        # 用水平布局排列两个图表,换成QVBoxLayout就是垂直排列
        main_layout = QHBoxLayout(self)
        # 实例化两个完全相同的图表
        self.plot_a = MyPlotWidget()
        self.plot_b = MyPlotWidget()
        # 添加到布局中
        main_layout.addWidget(self.plot_a)
        main_layout.addWidget(self.plot_b)
        # 调整布局间距和边距,优化界面观感
        main_layout.setSpacing(15)
        main_layout.setContentsMargins(20, 20, 20, 20)

# 3. 主窗口类:整合容器类,作为应用的主界面
class MainAppWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("双图表演示应用")
        self.setGeometry(100, 100, 1100, 600)
        # 将容器类设置为主窗口的中心部件
        self.plot_container = PlotContainerWidget()
        self.setCentralWidget(self.plot_container)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 设置pyqtgraph的全局样式(可选,让图表更好看)
    pg.setConfigOption('background', 'f0f0f0')
    pg.setConfigOption('foreground', '303030')
    main_window = MainAppWindow()
    main_window.show()
    sys.exit(app.exec_())
关键细节说明
  • 为什么用PlotWidget? 它是pyqtgraph中封装最完善的单图表组件,已经整合了GraphicsView和PlotItem,比直接用GraphicsWindow或GraphicsObject更适合快速构建标准化图表,减少底层细节的困扰。
  • 扩展性优化:如果后续需要修改图表样式或更新数据,只需要修改MyPlotWidget类即可,所有实例都会同步更新;如果要调整图表排列,直接修改PlotContainerWidget里的布局就行。
  • 动态更新数据:如果需要实时更新图表,你可以在MyPlotWidget里添加一个方法,比如:
    def update_plot_data(self, x_new, y_new):
        # 清除原有曲线
        self.clear()
        # 绘制新数据
        self.plot(x_new, y_new, pen='darkcyan', width=2)
    
    然后在外部调用plot_a.update_plot_data(new_x, new_y)就能更新指定图表的数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:16:03