【问题标题】:Live Data Monitor: PyQtGraph实时数据监视器:PyQtGraph
【发布时间】:2014-08-03 13:49:09
【问题描述】:

我正在开展一个项目,我必须分析来自设备的信号。我有一个正在工作的库,可以从设备中获取数据。截至目前,我正在收集数据然后绘制它。我有兴趣构建一个可以实时绘制图表的实时数据监视器。经过搜索,我发现 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 秒更新一次数据,但我希望它向右移动。

【问题讨论】:

    标签: python pyqt4 pyqtgraph


    【解决方案1】:

    要使情节滚动,您有三个选项:

    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
      

    scrolling-plots example(目前仅在开发版本中)演示了其中的每一个:

    【讨论】:

    • 谢谢!在您建议的示例中 update1 工作正常,但在 update2 之前出现错误,“plotItem has no attribute setLimits”。你能调查一下吗?
    • setLimits 仅在开发版本中可用。
    • 移动图似乎工作正常,但 Y 轴似乎自动调整范围不规律。所以看起来图表也在上下滑动。我尝试使用 setYRange,但问题是,图表变得太小和简洁,看起来不太好,并且无法清楚地看到小的变化。有没有办法让我两全其美?
    • 假设我的最小值为 1850,最大值为 2500。我的 seYRange 是从 1800 到 2500。我的大部分数据都在 2300-2400 数据范围内,但有时会达到 2200s 和一次它到 1850 年。所以我的图表的 Y 轴被分成 7 个区域(从 1800 年到 2500 年)。而且该图大多仅位于 2300-2400 区域 - 这使得它看起来非常小。 Y 间隔为 100 个单位。有没有可能让它更小一点——比如 25 个单位?那不是 2000-2100-2200,我想要 2000-2025-2050...
    • 啊,我明白了——您不希望数据更大,您只想让刻度更密集。在这种情况下,查看graphicsItems/AxisItem.py 内部,在__init__() 方法中,您将看到self.style['textFillLimits'],这是一组用于确定最佳刻度间距的启发式方法。您可以在任何 AxisItem 上修改这些值..
    猜你喜欢
    • 2013-07-30
    • 2020-12-30
    • 2012-10-22
    • 1970-01-01
    • 2014-08-14
    • 2021-01-26
    • 2019-02-02
    • 2016-09-01
    • 1970-01-01
    相关资源
    最近更新 更多