
本文详解如何使用 PyQtGraph 创建单窗口多子图布局,在同一窗口内组织多个坐标轴(PlotItem),并在每个轴上叠加绘制多条数据曲线,避免默认 pg.plot() 多次调用导致的多个独立窗口问题。
本文详解如何使用 pyqtgraph 创建单窗口多子图布局,在同一窗口内组织多个坐标轴(plotitem),并在每个轴上叠加绘制多条数据曲线,避免默认 `pg.plot()` 多次调用导致的多个独立窗口问题。
PyQtGraph 提供了高度灵活的图形布局系统,其核心在于 GraphicsLayoutWidget —— 它是一个基于网格的容器,可像表格一样按行列添加多个 PlotItem(即独立坐标系),每个 PlotItem 又可容纳多条曲线(如 PlotDataItem)。这与 Matplotlib 的 subplots 逻辑类似,但更轻量、无需显式依赖 PyQt 应用主循环初始化(pg.mkQApp() 自动处理)。
以下为完整可运行示例,展示如何在单窗口中创建两个并排子图(左图含两条线,右图含一条线):
import pandas as pd
import pyqtgraph as pg
# 构造示例数据
a = [
{'a': 5, 'b': 10, 'c': 5},
{'a': 4, 'b': 0.5, 'c': 1},
{'a': 3.5, 'b': 15, 'c': 9},
{'a': 2.1, 'b': 5, 'c': 8},
{'a': 0.1, 'b': 1, 'c': 5},
]
df = pd.DataFrame(a)
# 1. 创建 Qt 应用实例(必需,pg.mkQApp() 自动管理)
app = pg.mkQApp()
# 2. 创建图形布局容器(单窗口根部件)
fig_widget = pg.GraphicsLayoutWidget()
fig_widget.setWindowTitle("PyQtGraph 多子图示例")
fig_widget.resize(800, 400)
# 3. 创建两个 PlotItem(即两个独立坐标轴)
p1 = pg.PlotItem(title="子图 1:a & b 曲线")
p2 = pg.PlotItem(title="子图 2:c 曲线")
# 4. 将 PlotItem 按网格位置添加到布局(第0行,第0列 和 第0行,第1列)
fig_widget.addItem(p1, 0, 0)
fig_widget.addItem(p2, 0, 1)
# 5. 创建曲线对象(支持自动绘图、缩放、交互)
curve_a = pg.PlotDataItem(df["a"].values, pen='r', name='a', symbol='o', symbolSize=5)
curve_b = pg.PlotDataItem(df["b"].values, pen='g', name='b', symbol='s', symbolSize=5)
curve_c = pg.PlotDataItem(df["c"].values, pen='b', name='c', symbol='t', symbolSize=5)
# 6. 将曲线添加到对应坐标轴
p1.addItem(curve_a)
p1.addItem(curve_b)
p2.addItem(curve_c)
# 7. 显示窗口并启动事件循环
fig_widget.show()
app.exec()✅ 关键要点说明:
- ❌ 避免直接多次调用
pg.plot():每次调用会新建一个独立窗口; - ✅ 使用
GraphicsLayoutWidget作为统一容器,替代多个PlotWidget实例; - ✅
PlotItem是真正的“轴”(含坐标系、标签、图例等),而PlotWidget是带边框/菜单的完整控件,不适用于嵌套布局; - ✅
PlotDataItem支持丰富的样式(颜色、线型、标记符号)、图例绑定(需配合addLegend())及交互(拖拽、缩放、鼠标悬停); - ✅ 所有绘图均在 Qt 主线程完成,无需手动管理
QApplication.exec_(),pg.mkQApp()已封装最佳实践。
? 进阶提示: 若需共享 X 轴、添加图例或响应鼠标事件,可在 PlotItem 上调用 p1.addLegend()、p1.setAxisItems(...) 或连接 p1.scene().sigMouseClicked 等信号,进一步增强可视化能力。

















