实时数据监控:PyQtGraph

5 投票
1 回答
17691 浏览
提问于 2025-04-18 09:38

我正在做一个项目,需要分析来自一个设备的信号。我有一个可以获取设备数据的库,现在我在收集这些数据并绘制图表。我想做一个实时数据监控器,可以实时绘制图形。经过搜索,我发现PyQtGraph非常适合这个任务。不过我对Qt不太熟悉,所以我在找一些可以修改的例子。PyQtGraph文档中有一些例子可以实时更新图表,但我需要的是一个实时监控的效果——也就是说,图表要随着数据的接收向右移动。

如果数据是一个已知的连续函数,我可以用x - w*t来更新输入,其中t是时间,这样波形就会向右移动。但我现在处理的是离散数据,所以我不太确定如何用PyQtGraph实现这个效果。如果有人能给我一些建议该怎么做,那就太好了。

目前我有的代码是这样的:

代码

app = QtGui.QApplication([])
#mw = QtGui.QMainWindow()
#mw.resize(800,800)

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)

p6 = win.addPlot(title="Updating plot")
curve = p6.plot(pen='r')
X_axis = numpy.linspace(0,100,12800)
#'data' is my required y_axis containing 12800 values
ydata = np.array_split(data,50)
xdata = np.array_split(X_axis,50)
ptr = 0
def update():
    global curve, data, ptr, p6
    curve.setData(xdata[ptr%50],ydata[ptr%50])
    ptr += 1
timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(1000)

这个代码每2秒更新一次数据,但我希望它能向右移动。

1 个回答

7

要让图表可以滚动,你有三种选择:

  1. 滚动原始数据并重新绘制图表(可以参考 numpy.roll

    curve = plotItem.plot(data)
    data = np.roll(data, 1)  # scroll data
    curve.setData(data)      # re-plot
    
  2. 移动图表曲线,让它在视图中滑动:

    curve = plotItem.plot(data)
    curve.setPos(x, 0)  # Move the curve
    
  3. 移动视图区域,让图表曲线看起来像是在滚动

    curve = plotItem.plot(data)
    plotItem.setXRange(x1, x2)  # Move the view
    

滚动图表示例(目前只在开发版本中)展示了这三种方法:

撰写回答