如何在pyqtgraph中加速实时绘图

3
简而言之,我正在尝试找到一种更快的方法来绘制通过串行输入传输的实时数据。该数据看起来像一个坐标(x,y),每秒钟约有40个。流将使用x作为索引并将y设置为其值将数据存储在数组中。这部分正在进行线程处理。虽然流可以立即读取数据,但pyqtgraph库无法跟上这个速度。
下面是我绘制数据的代码部分。distances和theta变量是具有6400个索引的数组。它们已被转换为极坐标值,并在每次迭代中绘制。我在那里添加了一个延迟,只是为了帮助保持实时性,尽管这只是一个临时解决方案。
while True:
    x = distances * np.cos(theta)
    y = distances * np.sin(theta)
    plot.plot(x, y, pen=None, symbol='o', clear=True)
    pg.QtGui.QApplication.processEvents()


    #sleep(0.025)

虽然它的运行方式符合我的预期,但无法绘制串口输入的最新数据。它距离最近的读数可能会有几秒钟的延迟,这可能是因为它无法在每1/40秒内绘制6400个点。我想知道是否有一种方法可以仅更新一个点,而不必每次重新绘制整个散点图。
可能可以基于点进行绘制,但如果这样做,是否有一种方法来跟踪每个单独的点?不应该存在具有相同角度值但具有不同距离的点,并且应该覆盖它。
我还想知道是否有其他动画图形库可供选择,这可能是一个值得考虑的解决方案。
如果你想知道它是什么样子的,就像这样:

enter image description here

1个回答

4
使用多线程可以让您始终拥有可用于绘制的数据,但由于每个绘图迭代的paintEvent延迟,绘图速度会受到瓶颈的影响。据我所知,无法使用setData更新每个paint事件的1个点,而不必为每个迭代重新绘制整个数据集。因此,如果您有6400个数据点,则即使您只是更新另外1个点的数据,也必须重绘所有点。
解决此问题的潜在方法包括缩小数据集或仅在每X个数据点中绘制一次。基本上,您的绘图速度受限于向屏幕绘制数据的速度,但您可以更改数据集以使用较少的屏幕刷新来显示最相关的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接