在 Python 和 pyqtgraph 的不同图形上绘制多个数据流的最佳实践
Best practice for plotting multiple streams of data on different graphs in Python & pyqtgraph
我正在用 PyQt 编写一个应用程序,它接收 8 个传感器波形,并且我在一个 window 中有 8 个 QGraphicViews 来流式传输 8 个数据。当我只使用一个传感器时,一切正常。但是如果我使用所有 8 个实时流,绘图就会变慢并崩溃。
在同时绘制大量实时流以减少性能时间时,最佳做法是什么?应该注意什么?多线程会有帮助吗?以较慢的帧速率绘图?
由于任务是 CPU 绑定的,并且您仍然 运行 在一个核心上(对于 Python,默认情况下),多线程将没什么用处。此外,PyQtGraph 不能在多线程中完成任何绘图:一切都必须在主线程中完成(请参阅作者对类似主题的回复 here)。因此,尽管多线程或多处理可以帮助您获取或处理数据,但它无法解决主要瓶颈:以过高的速率在过少的数据中绘制过多的数据 space。
解决办法?下采样。方便的是,PyQtGraph 有这个 builtin。这是一个示例(修改自 PyQtGraph 示例套件)。
import numpy as np
import pyqtgraph as pg
from PySide import QtGui, QtCore
win = pg.GraphicsWindow(title="Basic plotting examples")
win.resize(1000,600)
win.setWindowTitle('pyqtgraph example: Plotting')
# Enable antialiasing for prettier plots
pg.setConfigOptions(antialias=True)
p1 = win.addPlot(title="Downsampled")
# normally would plot 1000, but we downsample by 10 fold
p1.plot(np.random.normal(size=1000), pen=(255,0,0), name="Red curve", downsample=10)
p2 = win.addPlot(title="Normal")
p2.plot(np.random.normal(size=1000), pen=(0,0,255), name="Blue curve",)
## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
QtGui.QApplication.instance().exec_()
结果是,我们左侧的点数减少了 10 倍,从而提高了性能。
我正在用 PyQt 编写一个应用程序,它接收 8 个传感器波形,并且我在一个 window 中有 8 个 QGraphicViews 来流式传输 8 个数据。当我只使用一个传感器时,一切正常。但是如果我使用所有 8 个实时流,绘图就会变慢并崩溃。
在同时绘制大量实时流以减少性能时间时,最佳做法是什么?应该注意什么?多线程会有帮助吗?以较慢的帧速率绘图?
由于任务是 CPU 绑定的,并且您仍然 运行 在一个核心上(对于 Python,默认情况下),多线程将没什么用处。此外,PyQtGraph 不能在多线程中完成任何绘图:一切都必须在主线程中完成(请参阅作者对类似主题的回复 here)。因此,尽管多线程或多处理可以帮助您获取或处理数据,但它无法解决主要瓶颈:以过高的速率在过少的数据中绘制过多的数据 space。
解决办法?下采样。方便的是,PyQtGraph 有这个 builtin。这是一个示例(修改自 PyQtGraph 示例套件)。
import numpy as np
import pyqtgraph as pg
from PySide import QtGui, QtCore
win = pg.GraphicsWindow(title="Basic plotting examples")
win.resize(1000,600)
win.setWindowTitle('pyqtgraph example: Plotting')
# Enable antialiasing for prettier plots
pg.setConfigOptions(antialias=True)
p1 = win.addPlot(title="Downsampled")
# normally would plot 1000, but we downsample by 10 fold
p1.plot(np.random.normal(size=1000), pen=(255,0,0), name="Red curve", downsample=10)
p2 = win.addPlot(title="Normal")
p2.plot(np.random.normal(size=1000), pen=(0,0,255), name="Blue curve",)
## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
QtGui.QApplication.instance().exec_()
结果是,我们左侧的点数减少了 10 倍,从而提高了性能。