
本文详解如何使用 pyqtgraph 独立构建 gui 窗口(无需手动引入 pyqt),通过 graphicslayoutwidget 统一管理多个 plotitem 子图,并在每个子图中叠加绘制多条数据曲线。
本文详解如何使用 pyqtgraph 独立构建 gui 窗口(无需手动引入 pyqt),通过 graphicslayoutwidget 统一管理多个 plotitem 子图,并在每个子图中叠加绘制多条数据曲线。
PyQtGraph 提供了轻量、高效的绘图能力,其核心优势之一是无需显式依赖 PyQt/PySide 的完整应用框架即可快速启动可视化界面。关键在于使用 pg.mkQApp() 自动初始化 QApplication 实例,并借助 GraphicsLayoutWidget 作为布局容器——它类似于 Matplotlib 的 subplots,但更灵活、响应更快,支持行列网格化排布多个独立坐标系(即 PlotItem)。
每个 PlotItem 相当于一个“轴”(ax),可独立设置标题、坐标轴范围、网格、图例等;而真正承载数据的是 PlotDataItem(或更常用的 plot() 方法返回的 PlotCurveItem)。注意:不要直接将数组传给 PlotWidget() 构造函数(如 pg.PlotWidget(df['a'].values)),该类不接受数据参数,且 MultiPlotWidget 已被弃用;正确做法是先创建空 PlotItem,再调用 addItem() 添加数据项。
以下是一个完整、可运行的示例代码:
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. 创建 QApplication(自动检测并复用已有实例)
app = pg.mkQApp()
# 2. 创建图形布局主窗口
fig_widget = pg.GraphicsLayoutWidget(show=True, title="Multiple Plots Example")
fig_widget.resize(800, 400)
# 3. 创建两个 PlotItem(即两个独立坐标系)
p1 = pg.PlotItem(title="Plot 1: a & b")
p2 = pg.PlotItem(title="Plot 2: c")
# 4. 将 PlotItem 添加到布局(第0行,第0列 和 第0行,第1列)
fig_widget.addItem(p1, 0, 0)
fig_widget.addItem(p2, 0, 1)
# 5. 创建并添加曲线(支持同一 PlotItem 中叠加多条线)
p1.plot(df['a'].values, name='Series a', pen='r', symbol='o', symbolSize=5)
p1.plot(df['b'].values, name='Series b', pen='g', symbol='s', symbolSize=5)
p2.plot(df['c'].values, name='Series c', pen='b', symbol='t', symbolSize=6)
# 可选:为 p1 添加图例
p1.addLegend()
# 启动事件循环
app.exec()? 关键注意事项:
- ✅ 始终调用
pg.mkQApp()而非手动QApplication([]),避免重复初始化冲突; - ✅ 使用
GraphicsLayoutWidget+PlotItem组合实现多子图,而非多个PlotWidget(后者会弹出多个窗口); - ✅ 在
PlotItem上绘图应使用.plot()方法(简洁)或.addItem(PlotDataItem(...))(精细控制); - ⚠️
MultiPlotWidget和旧版pg.plot()独立调用方式已不适用于多图协同场景,应避免; - ? 如需共享 X 轴缩放、联动平移,可启用
linkView()或使用ViewBox高级功能,本文未展开但值得进阶探索。
通过上述结构,你可以在单一 PyQtGraph 窗口中自由组织任意行列数的子图,并在每个子图中叠加任意数量的数据曲线,兼顾清晰性与交互性能。

















