PyQtGraph 绘图

数据绘图方案

Python语言 的数据可视化(绘图) 方法,常见的有 Matplotlib 和 PyQtGraph

  • Matplotlib

说到 Python语言 的数据作图, Matplotlib 当然是最有名的。

优点: 功能完备、成熟稳定、社区生态圈庞大。

缺点: 某些作图场景性能不高,和Qt图形界面框架 融合的不太好。

  • PyQtGraph

PyQtGraph 是基于Qt 的纯Python 库。

优点: 大数据量的作图性能远高于 Matplotlib, 动态更新图的性能也比Matplotlib高。

并且和Qt图形界面框架完美融合,因为它就是基于Qt开发的。

缺点: 作图功能没有Matplotlib多,开发社区没有Matplotlib大。


那么,我们应该使用哪种方案呢?我的建议是:

如果你已经使用Qt开发图形界面程序了,并且作图功能是PyQtGraph支持的, 建议使用 PyQtGraph,因为它和Qt界面无缝结合。

否则 使用 Matplotlib。


本文先介绍 PyQtGraph 的使用示例。

PyQtGraph 安装

如果你使用的 pyqt5 ,执行如下命令安装

pip install pyqtgraph

如果你使用的 pyside2 ,执行如下命令安装

pip install git+https://github.com/pyqtgraph/pyqtgraph

这是因为pypi上的版本目前还没有把pyside2的支持加上。

参考 https://github.com/pyqtgraph/pyqtgraph#installation-methods


官方案例

PyQtGraph 官方文档包含了很多示例代码,我们只需运行如下代码,即可查看这些demo和对应的代码

import pyqtgraph.examples
pyqtgraph.examples.run()

XY 轴曲线图 demo

下面是一个最常见的 根据x/y轴对应的值 作曲线图的例子

from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg

# 创建 PlotWidget 对象
pw = pg.plot()

# 设置图表标题、颜色、字体大小
pw.setTitle("气温趋势",color='008080',size='12pt')

# 背景色改为白色
pw.setBackground('w')

# 显示表格线
pw.showGrid(x=True, y=True)

# 设置上下左右的label
# 第一个参数 只能是 'left', 'bottom', 'right', or 'top'
pw.setLabel("left", "气温(摄氏度)")
pw.setLabel("bottom", "时间")

# 设置Y轴 刻度 范围
pw.setYRange(min=-10,  # 最小值
             max=50)  # 最大值

# 创建 PlotDataItem ,缺省是曲线图
curve = pw.plot( pen=pg.mkPen('b')) # 线条颜色

hour = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
temperature = [30, 32, 34, 32, 33, 31, 29, 32, 35, 45]

curve.setData(hour, # x坐标
              temperature  # y坐标
              )

QtGui.QApplication.instance().exec_()

嵌入到Qt程序界面中

上面的例子,图表是在单独的程序中运行显示。

如果我们要把它 嵌入到我们的Qt程序界面 中,代码如下所示

from PySide2 import QtWidgets
import pyqtgraph as pg

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super().__init__()

        self.setWindowTitle('pyqtgraph作图示例')

        # 创建 PlotWidget 对象
        self.pw = pg.PlotWidget()

        # 设置图表标题
        self.pw.setTitle("气温趋势",
                         color='008080',
                         size='12pt')

        # 设置上下左右的label
        self.pw.setLabel("left","气温(摄氏度)")
        self.pw.setLabel("bottom","时间")

        # 设置Y轴 刻度 范围
        self.pw.setYRange(min=-10, # 最小值
                          max=50)  # 最大值


        # 显示表格线
        self.pw.showGrid(x=True, y=True)

        # 背景色改为白色
        self.pw.setBackground('w')

        # 居中显示 PlotWidget
        self.setCentralWidget(self.pw)

        hour = [1,2,3,4,5,6,7,8,9,10]
        temperature = [30,32,34,32,33,31,29,32,35,45]

        # hour 和 temperature 分别是 : x, y 轴上的值
        self.pw.plot(hour, 
                     temperature,
                     pen=pg.mkPen('b') # 线条颜色
                    )

if __name__ == '__main__':
    app = QtWidgets.QApplication()
    main = MainWindow()
    main.show()
    app.exec_()

实时更新图

要画动态的实时更新图,只需要在把变更的内容重新plot即可。

示例代码如下

from PySide2 import QtWidgets
from pyqtgraph.Qt import  QtCore
import pyqtgraph as pg
import sys
from random import randint

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super().__init__()

        self.setWindowTitle('pyqtgraph作图')

        # 创建 PlotWidget 对象
        self.pw = pg.PlotWidget()

        # 设置图表标题
        self.pw.setTitle("气温趋势",
                         color='008080',
                         size='12pt')

        # 设置上下左右的label
        self.pw.setLabel("left","气温(摄氏度)")
        self.pw.setLabel("bottom","时间")

        # 设置Y轴 刻度 范围
        self.pw.setYRange(min=-10, # 最小值
                          max=50)  # 最大值

        # 显示表格线
        self.pw.showGrid(x=True, y=True)

        # 背景色改为白色
        self.pw.setBackground('w')

        # 设置Y轴 刻度 范围
        self.pw.setYRange(min=-10, # 最小值
                          max=50)  # 最大值

        # 居中显示 PlotWidget
        self.setCentralWidget(self.pw)

        # 实时显示应该获取 plotItem, 调用setData,
        # 这样只重新plot该曲线,性能更高
        self.curve = self.pw.getPlotItem().plot(
            pen=pg.mkPen('r', width=1)
        )

        self.i = 0
        self.x = [] # x轴的值
        self.y = [] # y轴的值

        # 启动定时器,每隔1秒通知刷新一次数据
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.updateData)
        self.timer.start(1000)

    def updateData(self):
        self.i += 1
        self.x.append(self.i)
        # 创建随机温度值
        self.y.append(randint(10,30))

        # plot data: x, y values
        self.curve.setData(self.x,self.y)

if __name__ == '__main__':
    app = QtWidgets.QApplication()
    main = MainWindow()
    main.show()
    app.exec_()
上一页
下一页