Монитор данных в реальном времени: PyQtGraph

Я работаю над проектом, в котором мне придется анализировать сигналы, поступающие от устройства. У меня работает библиотека, которая получает данные с устройства. На данный момент я собираю данные, а затем рисую их. Я заинтересован в создании монитора данных в реальном времени, который может строить график в режиме реального времени. После поиска я понял, что 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-секундного интервала, но я хочу, чтобы они двигались вправо.


person user1955184    schedule 13.06.2014    source источник


Ответы (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
    

пример прокрутки (в настоящее время только в версии для разработки) демонстрирует каждый из них:

person Luke    schedule 13.06.2014
comment
Спасибо! В предложенном вами примере update1 работает нормально, но перед update2 возникает ошибка, plotItem не имеет атрибута setLimits . Не могли бы вы взглянуть на это? - person user1955184; 15.06.2014
comment
setLimits доступен только в версии для разработчиков. - person Luke; 15.06.2014
comment
Движущийся график, кажется, работает нормально, но ось Y, кажется, автоматически регулирует диапазон беспорядочно. Таким образом, похоже, что график также скользит вверх и вниз. Я пытался использовать setYRange, но проблема в том, что график становится слишком маленьким и лаконичным, он выглядит не очень хорошо, а небольшие вариации не видны четко. Есть ли способ, где я могу получить лучшее из обоих миров? - person user1955184; 18.06.2014
comment
Допустим, у меня есть минимальное значение 1850 и максимальное значение 2500. Мой seYRange находится в диапазоне от 1800 до 2500. Большинство моих данных находятся в диапазоне данных 2300-2400, но иногда они доходят до 2200, а однажды доходят до 1850. Итак, мой график Ось Y разделена на 7 областей (от 1800 до 2500). И график в основном находится только в районе 2300-2400, из-за чего он выглядит очень маленьким. Y-интервал составляет 100 единиц. Можно ли сделать его немного меньше - например, 25 единиц? То есть вместо 2000-2100-2200 я хочу 2000-2025-2050... - person user1955184; 19.06.2014
comment
Ах, я вижу - вы не хотите, чтобы данные были больше, вы просто хотите, чтобы тики были более плотными. В этом случае загляните внутрь graphicsItems/AxisItem.py, в методе __init__() вы увидите self.style['textFillLimits'], представляющий собой набор эвристик, используемых для определения оптимального шага деления. Вы можете изменить эти значения в любом AxisItem. - person Luke; 20.06.2014
comment
Привет @ Люк.. Я тоже пытаюсь сделать то же самое, что указано в вопросе. Но я не могу заставить его работать на моей машине после установки «pyqt4». Пожалуйста, помогите мне с установкой этого. - person SriramK89; 26.04.2015