实时数据监控:PyQtGraph

5
我正在处理一个项目,需要分析来自设备的信号。我已经有了一个工作库,可以从设备中获取数据。目前,我正在收集数据并将其绘制成图表。我想构建一个实时数据监视器,可以实时绘制图形。通过搜索,我发现PyQtGraph非常适合这个任务。由于我不熟悉Qt,因此我正在寻找可以根据自己的需求修改的示例。PyQtGraph文档中提供了一些示例,可以实时更新图表,但我需要像实时监视器那样移动图形,因为它不断接收数据。

如果这是一个已知的连续函数,我可以使用输入x-w*t来更新,并且t是时间,以使波向右移动。但是这是离散数据,所以我不确定如何使用PyQtGraph使其正常工作。因此,如果有人能够提供如何操作的指针,那将是很好的。

目前我只有这些代码:

Code

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)

这里每两秒更新一次数据,但我希望它向右移动。

1个回答

7
为了使图表滚动,你有三个选项:
  1. Scroll the raw data and re-plot (see numpy.roll)

    curve = plotItem.plot(data)
    data = np.roll(data, 1)  # scroll data
    curve.setData(data)      # re-plot
    
  2. Move the plot curve so that it slides across the view:

    curve = plotItem.plot(data)
    curve.setPos(x, 0)  # Move the curve
    
  3. Move the view region such that the plot curve appears to scroll

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

这个滚动绘图示例(目前仅在开发版本中可用)展示了以下内容:


1
谢谢!在您建议的例子中,update1可以正常工作,但在update2之前有一个错误,“plotItem没有setLimits属性”。您能否请看一下这个问题? - user1955184
1
setLimits 只在开发版本中可用。 - Luke
移动的图表似乎工作正常,但是Y轴似乎会自动调整范围,导致图表上下滑动。我尝试使用setYRange,但问题在于图表变得太小和简洁,不美观,而且小的变化也无法清晰地看到。有没有一种方法可以兼顾两全? - user1955184
假设我有最小值1850和最大值2500。我的y轴范围是从1800到2500。我的大部分数据在2300-2400的数据范围内,但有时会到2200年代,有一次到了1850。因此,我的图表的y轴分为7个区域(从1800到2500)。而且图表大多数情况下只在2300-2400的区域内 - 这使它看起来非常小。Y间隔为100个单位。是否可能使其更小一些,例如25个单位?即我想要的不是2000-2100-2200,而是2000-2025-2050... - user1955184
啊,我明白了——你不想让数据变大,只是想让刻度更密集。在这种情况下,请查看graphicsItems/AxisItem.py文件中的__init __()方法,在其中你会看到self.style['textFillLimits'],它是用于确定最佳刻度间距的一组启发式算法。你可以在任何AxisItem上修改这些值。 - Luke
嘿@Luke..我也在尝试做与问题中给出的相同的事情。但是在安装了'pyqt4'之后,我无法使其在我的机器上运行。请帮我安装这个。 - SriramK89

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