如何用PyQtGraph高效绘制上游进程逐个传入的实时滚动数据
无需缓冲实现pyqtgraph高效滚动绘图的方法
以下几种方法可以实现无缓冲状态下的高效滚动绘图,核心是减少不必要的开销、优化更新逻辑:
复用单个曲线对象,避免重复创建
不要每次收到新样本就创建新的PlotCurveItem,初始化时创建一次曲线,之后仅更新其数据数组,并保持数据长度在固定范围内(实现滚动效果)。这种方式避免了频繁创建/销毁图形元素的性能损耗。
示例代码:# 初始化阶段 self.plot_widget = pg.PlotWidget() self.curve = self.plot_widget.plot() self.x_data = [] self.y_data = [] self.max_display_points = 1000 # 设定最多显示的点数 # 接收新样本时的更新逻辑 def update_plot(self, new_x, new_y): self.x_data.append(new_x) self.y_data.append(new_y) # 截断旧数据,保持滚动范围 if len(self.x_data) > self.max_display_points: self.x_data = self.x_data[-self.max_display_points:] self.y_data = self.y_data[-self.max_display_points:] # 直接更新已有曲线的数据 self.curve.setData(self.x_data, self.y_data)启用pyqtgraph内置的下采样优化
利用PlotDataItem的downsample和autoDownsample参数,让pyqtgraph自动对超出屏幕显示能力的数据进行下采样,减少实际绘制的点数,大幅降低渲染压力。
示例:# 初始化曲线时开启下采样 self.curve = self.plot_widget.plot(downsample=True, autoDownsample=True)将数据接收与绘图更新解耦
把上游数据的接收逻辑放到独立线程中,通过信号槽机制将数据传递到主线程进行绘图更新。这样主线程不会被数据接收阻塞,保证绘图更新的流畅性。
示例:from PyQt5.QtCore import QThread, pyqtSignal class DataFetchThread(QThread): sample_ready = pyqtSignal(float, float) # 传递单样本(x,y) def run(self): while self.isRunning(): # 模拟从上游获取单个样本 x_val, y_val = get_single_sample() self.sample_ready.emit(x_val, y_val) # 主窗口中绑定信号 self.fetch_thread = DataFetchThread() self.fetch_thread.sample_ready.connect(self.update_plot) self.fetch_thread.start()关闭非必要的绘图特性
关闭抗锯齿、自动缩放、网格等非必需功能,减少绘图时的计算量:# 关闭曲线抗锯齿 self.curve.setAntialias(False) # 关闭自动缩放,固定显示范围 self.plot_widget.enableAutoRange('xy', False) # 隐藏不需要的坐标轴或网格 self.plot_widget.getPlotItem().hideGrid(x=True, y=True)
这些方法不需要依赖数据缓冲,通过优化绘图逻辑和利用pyqtgraph的内置特性,就能实现单个样本更新时的高效滚动绘图。
内容的提问来源于stack exchange,提问作者BigBrownBear00
相关产品推荐
相关产品推荐

