page contents

Pyqtgraph科学绘图:Python高性能实时数据可视化的Qt图形界面应用!

记得那次做实时监控项目的时候 matplotlib差点把我逼疯了。数据更新频率一高 整个界面就卡得要死 用户体验简直灾难。后来无意中接触到pyqtgraph 这才发现原来Python也能做出如此流畅的实时绘图。

attachments-2025-07-zqR2TaPi6865dd98b773c.jpg记得那次做实时监控项目的时候 matplotlib差点把我逼疯了。数据更新频率一高 整个界面就卡得要死 用户体验简直灾难。后来无意中接触到pyqtgraph 这才发现原来Python也能做出如此流畅的实时绘图。

真的是相见恨晚啊。

01

当时项目需求很简单 实时显示传感器数据 每秒要更新几十次 matplotlib那套在这种场景下完全不行。我试过各种优化方法 什么blitting啊 动画缓存啊 效果都不理想。

偶然在GitHub上看到别人用pyqtgraph做的项目 那丝滑的动画效果让我眼前一亮。立马就决定试试这个库。

安装很简单:

pip install pyqtgraphpyqtgraph基于Qt框架 专门为科学计算设计的。最大的特点就是快 真的快到飞起。它使用OpenGL加速渲染 对大数据量的处理能力远超matplotlib。

02

第一次上手的时候 我写了个最简单的例子:

import pyqtgraph as pg

import numpy as np

from PyQt5.QtWidgets import QApplication

import sys

# 创建应用程序

app = QApplication(sys.argv)

# 创建绘图窗口

win = pg.GraphicsWindow(title="实时数据监控")

win.resize(800 400)

# 添加绘图区域

plot = win.addPlot(title="传感器数据")

plot.setLabel('left' '温度' units='°C')

plot.setLabel('bottom' '时间' units='s')

# 创建数据曲线

curve = plot.plot(pen='y')

# 模拟实时数据

data = np.random.random(100)

ptr = 0

def update():

    global data ptr

    data[ptr] = np.random.random()

    ptr += 1

    if ptr >= len(data):

        ptr = 0

    curve.setData(data)

# 设置定时器

timer = pg.QtCore.QTimer()

timer.timeout.connect(update)

timer.start(50)  # 每50ms更新一次

app.exec_()

这代码跑起来那个顺滑程度 和matplotlib比简直天壤之别。数据更新毫无卡顿 界面响应也很流畅。

03

当然了 真实项目肯定比这复杂。我在后续开发中发现了很多实用技巧。

比如多子图显示:

# 创建2x2的子图布局

win = pg.GraphicsWindow()

plots = []

for i in range(2):

    row_plots = []

    for j in range(2):

        plot = win.addPlot(row=i col=j)

        plot.setTitle(f'通道 {i*2+j+1}')

        row_plots.append(plot)

    plots.append(row_plots)    

# 为每个子图添加不同颜色的曲线

colors = ['r' 'g' 'b' 'y']

curves = []

for i in range(2):

    for j in range(2):

        curve = plots[i][j].plot(pen=colors[i*2+j])

        curves.append(curve)

还有就是数据缓冲区管理 这个特别重要。实时数据如果不限制大小 内存迟早爆掉:

class DataBuffer:

    def __init__(self max_size=1000):

        self.max_size = max_size

        self.data = np.zeros(max_size)

        self.index = 0

        self.count = 0

    

    def append(self value):

        self.data[self.index] = value

        self.index = (self.index + 1) % self.max_size

        if self.count < self.max_size:

            self.count += 1

    

    def get_data(self):

    def get_data(self):

        if self.count < self.max_size:

            return self.data[:self.count]

        else:

            # 返回正确顺序的数据

            return np.concatenate([

                self.data[self.index:],

                self.data[:self.index]

            ])用这个缓冲区 无论跑多长时间 内存占用都稳定。

04

pyqtgraph还有个杀手级功能 就是交互性特别强。用户可以随意缩放 拖拽 测量 这些在matplotlib里要写一堆代码才能实现。

我特别喜欢它的ROI功能:

# 添加可拖拽的ROI区域

roi = pg.ROI([10 10] [20 20])

plot.addItem(roi)

# ROI变化时的回调

def roi_changed():

    print(f"ROI位置: {roi.pos()}")

    print(f"ROI大小: {roi.size()}")   

roi.sigRegionChanged.connect(roi_changed)还有就是性能监控功能 开发阶段特别有用:

# 显示帧率

fps_label = pg.LabelItem(justify='right')

win.addItem(fps_label)

fps_timer = pg.QtCore.QTimer()

fps_counter = 0

last_time = time.time()

def update_fps():

    global fps_counter last_time

    fps_counter += 1

    current_time = time.time()

    if current_time - last_time >= 1.0:

        fps = fps_counter / (current_time - last_time)

        fps_label.setText(f'FPS: {fps:.1f}')

        fps_counter = 0

        last_time = current_time

fps_timer.timeout.connect(update_fps)

fps_timer.start(100)

05

不过pyqtgraph也不是完美的。文档确实比matplotlib少很多 有时候想实现某个功能得翻源码。还有就是样式定制没有matplotlib灵活 想要特别精美的图表可能还是得用其他库。

但对于实时数据可视化这种场景 pyqtgraph绝对是首选。我现在的项目基本都用它 再也不用担心界面卡顿了。

特别推荐给做数据采集 实时监控的朋友们。真的会让你的项目体验提升一个档次。当然前期学习成本是有的 但绝对值得。

pyqtgraph让我重新认识了Python在实时绘图方面的潜力 也让我明白选择合适的工具有多重要。有时候不是技术不行 而是工具没选对。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-07-03 09:32
  • 阅读 ( 45 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1335 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2172 文章
  3. Pack 1335 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章