Как ускорить построение графиков в реальном времени в pyqtgraph - PullRequest
1 голос
/ 15 мая 2019

Короче говоря, я пытаюсь найти более быстрый способ отображения данных в реальном времени, поступающих через последовательный вход.Данные выглядят как координаты (x, y) и около 40 поступают в каждую секунду.Поток будет хранить данные в массиве, используя x в качестве индекса и устанавливая y в качестве значения для него.Эта часть нарезается.Хотя поток может сразу считывать данные, библиотека pyqtgraph не может справиться с этой скоростью.

Вот часть кода, где я строю данные.Расстояния и тэта-переменные являются массивами с 6400 индексами.Они были преобразованы в полярные значения и нанесены на график с каждой итерацией.Я добавил задержку, чтобы сохранить ее в режиме реального времени, хотя это лишь временное решение.

while True:
    x = distances * np.cos(theta)
    y = distances * np.sin(theta)
    plot.plot(x, y, pen=None, symbol='o', clear=True)
    pg.QtGui.QApplication.processEvents()


    #sleep(0.025)

Пока все идет так, как я ожидаю, он не может отображать самые последние данные изпоследовательный вход.Он легко отстает на несколько секунд от последних чтений, возможно потому, что он не может построить 6400 точек каждые 1/40 секунды.Мне интересно, есть ли способ обновить только 1 очко, вместо того, чтобы заново пересчитывать весь разброс каждый раз в pyqtgraph.

Возможно построить график на основе точки, но если это так, есть ли способ отслеживать каждую отдельную точку?Не должно быть никакой точки, которая разделяет одно и то же значение угла и имеет разные расстояния, и должна существенно его перезаписывать.

Мне также интересно, есть ли другие библиотеки графической анимации, которые могли бы быть возможным решением, которое стоит рассмотреть.

Вот как это выглядит, если вам интересно:

enter image description here

1 Ответ

0 голосов
/ 16 мая 2019

Потоковая обработка позволяет вам всегда иметь данные, доступные для построения графика, но скорость графика является узким местом из-за задержки paintEvent для каждой итерации графика. Насколько я понимаю, нет способа обновить 1 очко за событие рисования с setData вместо того, чтобы заново отображать весь набор данных для каждой итерации. Поэтому, если у вас 6400, вы должны перекрасить все точки, даже если вы обновляете только данные с 1 дополнительной точкой.

Возможные обходные пути: уменьшение выборки ваших данных или построение графика только один раз на каждое количество точек данных. По сути, вы ограничены скоростью, с которой вы можете выводить данные на экран, но вы можете изменить свой набор данных, чтобы отображать наиболее релевантную информацию с меньшим количеством обновлений экрана.

...