PythonPyQtGraph图表制作教程
本文深入探讨了如何利用Python的PyQtGraph库构建高性能GUI图表,尤其是在实时数据可视化方面的应用。PyQtGraph凭借其C++底层和NumPy的深度集成,在处理大量数据时展现出卓越的效率和低延迟,远胜Matplotlib等库。教程详细介绍了如何通过多次调用plot()方法绘制多曲线,并利用addLegend()区分图例,以及如何通过PlotDataItem的setData()方法结合QTimer实现高效的动态数据更新,同时限制数据缓冲区大小以维持性能。此外,文章还分享了PyQtGraph与PyQt/PySide集成时的常见挑战及最佳实践,包括避免主线程阻塞、利用独立线程和信号-槽机制传递数据、管理内存防止无限增长,以及利用Qt布局管理器灵活组织多个PlotWidget,并通过API定制外观,旨在帮助读者构建响应迅速且可扩展的复杂GUI界面。
PyQtGraph在实时数据可视化中的独特优势在于其底层用C++实现并深度集成NumPy,处理大量数据时效率高、延迟低,专为高性能科学绘图设计,支持GPU加速,相比Matplotlib等库在动态更新场景下表现更流畅;2. 处理多曲线时可多次调用plot()方法并用addLegend()区分图例,动态更新通过PlotDataItem的setData()方法高效刷新数据,结合QTimer周期性更新并限制数据缓冲区大小以维持性能;3. 与PyQt/PySide集成时常见挑战包括避免主线程阻塞,最佳实践是将耗时计算放入独立线程并通过信号-槽机制传递数据,同时需管理内存防止无限增长,利用Qt布局管理器如QGridLayout灵活组织多个PlotWidget,并通过setBackground()、setLabel()等API定制外观,确保构建响应迅速且可扩展的复杂界面。
Python中构建GUI图表,尤其是需要高性能和实时交互的场景,PyQtGraph无疑是我个人非常偏爱的一个选择。它不像Matplotlib那样通用,但一旦涉及到科学计算、工程数据,或者说你需要一个能处理大量数据点且不卡顿的动态图表,PyQtGraph的效率和简洁性就显得尤为突出。说实话,我第一次用它的时候,就被它处理实时数据的流畅度惊艳到了,那感觉就像是终于找到了一个对的工具,能把脑子里的想法直接可视化出来,而且还跑得飞快。
解决方案
要用PyQtGraph构建一个基本的GUI图表,核心思路就是利用其提供的PlotWidget
或GraphicsLayoutWidget
作为容器,然后往里面添加数据。它不像一些其他库那样需要你写很多冗余的代码去设置各种细节,很多东西都是默认配置好的,直接拿来就能用。
一个简单的例子,我们来画一条正弦曲线:
import pyqtgraph as pg from pyqtgraph.Qt import QtGui, QtCore import numpy as np # 这是一个PyQt应用程序的基础,所有GUI应用都需要它 app = QtGui.QApplication([]) # 创建一个PlotWidget,这是PyQtGraph中最常用的绘图组件 # 它提供了一个完整的绘图区域,包含坐标轴、标题、图例等 win = pg.PlotWidget(title="我的第一个PyQtGraph图表:正弦波") win.show() # 显示窗口 win.resize(800, 600) # 设置窗口大小 # 生成数据 x = np.linspace(0, 2 * np.pi, 1000) y = np.sin(x) # 绘制数据 # plot方法非常灵活,可以直接传入x和y数据 # 也可以设置线条颜色、宽度等参数 curve = win.plot(x, y, pen=pg.mkPen(color=(255, 0, 0), width=2), name="正弦曲线") # 启动Qt事件循环,让GUI应用保持运行 if __name__ == '__main__': QtGui.QApplication.instance().exec_()
这段代码执行起来,你会看到一个非常干净、响应迅速的图表窗口,上面画着一条红色的正弦波。对我来说,这种直接了当的体验是PyQtGraph最吸引人的地方之一。
PyQtGraph在实时数据可视化中的独特优势是什么?
说到实时数据可视化,PyQtGraph的优势简直是碾压级的。我个人觉得,它之所以能在这方面做得这么好,主要归结于几个关键点。首先,它的底层是C++实现的,而且大量使用了NumPy进行数据处理。这意味着什么?这意味着它在处理大量数据点时,计算效率极高,内存占用也相对较小。不像一些纯Python的绘图库,数据量稍微大一点就容易卡顿,PyQtGraph在这方面表现得非常从容。
其次,它的设计哲学就是为了高性能的科学绘图而生。它不是一个万金油式的绘图工具,而是专注于快速更新、低延迟的图表显示。比如,如果你在做一个传感器数据采集系统,每秒钟需要绘制几百甚至几千个数据点,PyQtGraph就能轻松应对,图表更新几乎没有延迟,这对于需要即时反馈的应用来说至关重要。我曾经尝试用Matplotlib做类似的实时绘图,但很快就发现性能瓶颈,而PyQtGraph则能保持流畅的帧率。
此外,PyQtGraph对GPU加速也有不错的支持,虽然不是所有功能都依赖GPU,但在某些复杂场景下,它能进一步提升渲染效率。这种专注性让它在特定领域内表现得异常出色,它不是去追求花哨的图表样式,而是聚焦于核心的性能和功能。
如何处理PyQtGraph中的多曲线和动态更新?
在PyQtGraph中处理多曲线和动态更新,其实比你想象的要简单得多。这块儿确实是PyQtGraph的强项,也是我经常用到的功能。
多曲线绘制:
在一个PlotWidget
中添加多条曲线非常直观,你只需要多次调用plot()
方法即可。每一条曲线都会被独立管理。
# 假设我们已经有了win = pg.PlotWidget() # ... # 绘制第一条曲线(正弦) x1 = np.linspace(0, 2 * np.pi, 1000) y1 = np.sin(x1) curve1 = win.plot(x1, y1, pen='r', name="正弦") # pen='r'是红色简写 # 绘制第二条曲线(余弦) y2 = np.cos(x1) curve2 = win.plot(x1, y2, pen='g', name="余弦") # pen='g'是绿色简写 win.addLegend() # 添加图例,这样就能区分不同曲线了
动态更新数据:
这是PyQtGraph真正发光的地方。要动态更新曲线,你不需要重新创建整个图表,只需要更新现有曲线对象的数据。PlotDataItem
(plot()
方法返回的对象)提供了一个setData()
方法,直接传入新的x和y数组即可。
对于实时数据流,通常我们会结合QTimer
来周期性地更新数据。
# 假设我们已经有了app和win # ... # 初始数据 x_data = np.array([]) y_data = np.array([]) curve = win.plot(pen='y') # 先创建一个空曲线 # 更新函数 ptr = 0 # 模拟数据点索引 def update_plot(): global x_data, y_data, ptr # 模拟新数据点 new_x = ptr * 0.1 new_y = np.sin(new_x) + np.random.normal(size=1) * 0.1 # 加点噪声 # 追加新数据 x_data = np.append(x_data, new_x) y_data = np.append(y_data, new_y) # 为了防止数据无限增长,只保留最新的1000个点 if len(x_data) > 1000: x_data = x_data[-1000:] y_data = y_data[-1000:] # 更新曲线数据 curve.setData(x_data, y_data) ptr += 1 # 设置一个定时器,每50毫秒调用一次update_plot函数 timer = QtCore.QTimer() timer.timeout.connect(update_plot) timer.start(50) # 50毫秒 # ... 启动Qt事件循环
这段代码会创建一个不断滚动的实时曲线。这里要注意的是,setData()
操作非常高效,它只会更新需要改变的部分,而不是重新渲染整个图表,这对于保持流畅性至关重要。我有时会遇到一个坑,就是如果数据量非常大,并且每次更新都重建整个数组,可能会有性能问题。最好的做法是只更新增量数据,或者像上面例子那样,用一个固定大小的缓冲区。
PyQtGraph与PyQt/PySide集成时有哪些常见挑战和最佳实践?
PyQtGraph本身就是基于Qt框架构建的,所以它与PyQt或PySide的集成是天衣无缝的,这本身就是一个巨大的优势。然而,就像所有强大的工具一样,也有些小细节需要注意,才能让它们配合得更完美。
一个我经常遇到的挑战是线程问题。如果你在主GUI线程中执行耗时的数据处理或计算,那么你的GUI就会卡死,变得没有响应。这是Qt应用程序的通病,PyQtGraph也不例外。最佳实践是把所有重型计算都放到独立的线程中去执行,然后通过Qt的信号-槽机制把处理好的数据传递回主线程,再由主线程调用setData()
来更新图表。我通常会用QThread
或者Python的threading
模块来管理这些后台任务,确保GUI始终保持流畅。
另一个需要注意的点是内存管理。尤其是在处理长时间运行的实时数据流时,如果不对数据进行限制,内存会无限增长。就像前面提到的,我通常会限制显示的数据点数量,比如只保留最新的1000或5000个点。对于历史数据,可以考虑存储到数据库或文件中,而不是一直保存在内存中。
布局管理方面,PyQtGraph的PlotWidget
和GraphicsLayoutWidget
本身就是Qt的QWidget
子类,所以你可以很自然地把它们放到PyQt的各种布局管理器(如QVBoxLayout
, QHBoxLayout
, QGridLayout
)中。这让界面的组织变得非常灵活。比如,我经常会把多个PlotWidget
放到一个QGridLayout
里,实现多图表并排显示的效果。
# 简单的布局示例 from pyqtgraph.Qt import QtGui, QtCore import pyqtgraph as pg import numpy as np app = QtGui.QApplication([]) win = QtGui.QWidget() layout = QtGui.QGridLayout() # 使用网格布局 win.setLayout(layout) # 创建两个PlotWidget plot1 = pg.PlotWidget(title="图表一") plot2 = pg.PlotWidget(title="图表二") # 将它们添加到布局中 layout.addWidget(plot1, 0, 0) # 第0行,第0列 layout.addWidget(plot2, 0, 1) # 第0行,第1列 # 绘制一些数据 plot1.plot(np.sin(np.linspace(0, 10, 100))) plot2.plot(np.cos(np.linspace(0, 10, 100)), pen='g') win.show() win.resize(1000, 500) if __name__ == '__main__': QtGui.QApplication.instance().exec_()
这个例子展示了如何用Qt的布局来组织PyQtGraph的组件,这对于构建复杂的仪表盘界面非常实用。
最后,定制化外观也是一个方面。虽然PyQtGraph默认的样式已经很适合科学绘图了,但有时你可能需要更改背景色、字体、坐标轴标签等。PyQtGraph提供了丰富的API来做这些事情,比如setBackground()
、setLabel()
、setRange()
等等。我发现,花点时间阅读官方文档,了解这些定制选项,能让你的图表更符合特定应用的需求。这块儿可能需要一些试错,但一旦掌握了,就能随心所欲地调整图表样式了。
终于介绍完啦!小伙伴们,这篇关于《PythonPyQtGraph图表制作教程》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!

- 上一篇
- 多模态AI趋势与市场前景解读

- 下一篇
- 理想MEGAHome交付目标3000台,提车周期缩短
-
- 文章 · python教程 | 21分钟前 |
- chr函数在Python中的用法详解
- 325浏览 收藏
-
- 文章 · python教程 | 45分钟前 | Python 性能优化 连接池 clickhouse clickhouse-driver
- Python连接ClickHouse实战教程
- 165浏览 收藏
-
- 文章 · python教程 | 47分钟前 |
- PythonPCA降维详解与应用
- 209浏览 收藏
-
- 文章 · python教程 | 50分钟前 |
- Python正则匹配MAC地址技巧
- 303浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python定时任务怎么实现?
- 360浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python中elif的作用与用法详解
- 241浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python观察者模式实现与解耦技巧
- 488浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python日期转换技巧:datetime实用教程
- 443浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- 405错误怎么解决?前端部署教程
- 344浏览 收藏
-
- 文章 · python教程 | 1小时前 | JavaScript Python Selenium 反爬 H5视频链接
- Python抓取H5视频链接的技巧分享
- 467浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 151次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 143次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 157次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 150次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 159次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览