Как очистить график в цикле while при использовании PyQtGraph?

Я использую PyQtGraph для быстрой визуализации сбора данных. Для этого я постоянно перерисовываю данные, используя цикл while. Упрощенная версия этого кода дается:

import time
import numpy
import pyqtgraph as pg
from pyqtgraph.Qt import QtGui, QtCore

x = numpy.linspace(-2 * numpy.pi, 2 * numpy.pi, 1000)
y = numpy.cos(x)

# Plot
win = pg.GraphicsWindow()
win.resize(800, 800)

p = win.addPlot()
p.plot(x, y, pen = "y")

i = 0
while i < 5000:
  start_time = time.time()

  noise = numpy.random.normal(0, 1, len(y))
  y_new = y + noise

  p.plot(x, y_new, pen = "y", clear = True)
  p.enableAutoRange("xy", False)

  pg.QtGui.QApplication.processEvents()

  i += 1

  end_time = time.time()
  print("It has been {0} seconds since the loop started".format(end_time - start_time))

win.close()

Когда я измеряю каждую итерацию, я обнаруживаю, что неправильно очищаю график. Время итерации продолжает увеличиваться, и я замедляю сбор данных. В приведенном выше примере время итерации в начале составляет около 0.009 s, а в конце — около 0.04 s. Поэтому у меня утечка памяти.

Я знаю, что в matplotlib мне следует звонить в clf(), чтобы как следует очистить сюжет. К сожалению, я не так хорошо знаком с PyQtGraph и думал, что clear = True позаботится об этой проблеме. Я уверен, что это должно быть возможно, поскольку PyQtGraph был разработан для такого типа использования.

Как очищать график на каждой итерации, чтобы не замедлять сбор данных?


person The Dude    schedule 21.02.2016    source источник


Ответы (1)


Когда вы вызываете plot для вашего plotItem, вы создаете новый plotDataItem. Все эти plotDataItems, похоже, не проясняются должным образом. Вместо этого вы можете попробовать использовать только один plotDataItem и обновить его содержимое. Сделайте это с помощью

plot = p.plot(x, y, pen = "y")

а затем внутри вашего цикла

plot.setData(x, y_new)
person luddek    schedule 22.02.2016