QT、python实现高速动态绘图(基于pyside6、QCharts)
摘要
在python实现使用QCharts绘制高速的动态图(可达5ms数据刷新率),刷新率远远优于Matplotlib。适合配合界面进行实时数据采集的场合,如:工控设备数据采集UI
效果
python 2023-09-30 22-42-25
前言
由于项目需求,需要一个能够高速采集串口数据,并将数据以曲线形式显示出来的界面(ms级刷新率)。笔者曾经使用过matplotlib的animation来绘制,但是由于刷新速度始终无法提高,最终放弃该库。后来机缘巧合的发现了Pyside6里面有个QCharts也可用于绘图,于是尝试了一下,最终效果还不错,于是分享一下实现基本绘图功能的代码。
完整代码
"""
QChart动态绘图
"""
from PySide6.QtCharts import QChart, QChartView, QLineSeries, QValueAxis
from PySide6.QtGui import QPainter
from PySide6.QtCore import Qt, QTimer, QPointF # QPointF在QtCore中
from PySide6.QtWidgets import QApplication
import sys
import math
import numpy as np
class SinWaveChart(QChart):
def __init__(self):
super().__init__()
# 显示的时间范围
self.t_range = 1
self.Ts = 0.01
# 创建一个序列
self.series = QLineSeries()
self.addSeries(self.series)
# 创建坐标轴
self.axisX_ = QValueAxis()
self.axisY_ = QValueAxis()
self.addAxis(self.axisX_, Qt.AlignBottom)
self.addAxis(self.axisY_, Qt.AlignLeft)
self.series.attachAxis(self.axisX_)
self.series.attachAxis(self.axisY_)
self.axisX_.setTickCount(11)
# 初始化x的值
self.x = 0
# 设置y轴的范围
self.axisX_.setMin(self.x)
self.axisX_.setMax(self.t_range)
self.axisY_.setMin(-1)
self.axisY_.setMax(1)
self.points = []
self.timer = QTimer()
self.timer.timeout.connect(self.handleTimeout)
self.timer.start(self.Ts * 1000) # 更新频率60帧/秒
self.resize(500,500)
def handleTimeout(self):
y = math.sin(2*np.pi*self.x)
self.points.append(QPointF(self.x, y)) # 创建QPointF对象
self.x += self.Ts
if self.x > self.t_range:
self.axisX_.setRange(self.x - self.t_range, self.x - self.Ts)
self.points = self.points[-int(self.t_range/self.Ts):]
self.series.replace(self.points) # 使用replace()替换整个数据集
if __name__ == "__main__":
app = QApplication(sys.argv)
chart = SinWaveChart()
chart.legend().hide()
chart.setTitle("Dynamic sin wave")
chart_view = QChartView(chart)
chart_view.setRenderHint(QPainter.Antialiasing)
chart_view.show()
sys.exit(app.exec())