提到 GUI 绘图,大家可能第一反应是 OpenGL 和 Matplotlib,但其实基于 Qt 平台还有个功能强大的 pyqtgraph 绘图库,不仅支持丰富的图形种类,还能实时更新绘图数据并进行交互式操作。
不同于网上其他文章或代码讲解,今天我们集中只关注实时绘制数据功能的实现。为了更精准学习该 pyqtgraph 模块功能,我们将参考官方给出的实例来边学边练。
1. pyqtgraph 简介
1.1 pyqtgraph 特点
关于 pyqtgraph 与 Matplotlib 的对比,大致要点如下:
- pyqtgraph 在画图方面不如 Matplotlib 功能完整和成熟,但运行更快
- Matplotlib 旨在绘制高质量图像,pyqtgraph 则主要面向数据抓取和数据分析的应用
- 相比 Matplotlib,pyqtgraph 对 python 和 qt 编程更亲和
- pyqtgraph 具备更好的图像交互、3D展示等
1.2 pyqtgraph 安装
一般配合 PyQt5 使用,这些都要预先安装好,我们这里只提 pyqtgraph 相关:
pip install pyqtgraph
1.3 pyqtgraph 实例全集
官方专门给出了一个实例集合,包含了展示与源码,非常方便学习,通过以下代码来运行:
import pyqtgraph.examples
pyqtgraph.examples.run()
运行后,会出现如下 GUI 界面
今天我们主要关注实时绘制数据,找到左侧目录中的 “Scrolling plots”,单击右侧可以看到源码
双击或者点击下方的 “Run Example” 便可展示运行效果:
特定截图:
2. 实时绘制学习
结合着实例代码和演示效果,我们可以看到有如下不同实时展示模式:
- 模式1: 从 0 开始固定 x 轴数值范围,数据在该范围内向左移动展示
- 模式2: 数据带着 x 轴坐标一起向左移动展示
- 模式3: 固定 x 轴数值右侧范围到 0,数据左移展示
- 模式4: 左侧固定从 0 开始,数据累积展示
- 模式5: 数据范围右侧截止到 0,但仍可查看大于 0 范围
2.1 模式1: 固定 x 范围,左移展示数据
2.1.1 模式1效果
2.1.2 实例1代码
我们可以在实例汇总的代码中将该部分代码抽离出来,大致如下:
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
win = pg.GraphicsLayoutWidget(show=True)
win.setWindowTitle('Scrolling Plots Mode 1')
p1 = win.addPlot()
data1 = np.random.normal(size=300)
curve1 = p1.plot(data1)
def update1():
global data1, ptr1
data1[:-1] = data1[1:] # shift data in the array one sample left
# (see also: np.roll)
data1[-1] = np.random.normal()
curve1.setData(data1)
timer = pg.QtCore.QTimer()
timer.timeout.connect(update1)
timer.start