Я пытаюсь построить некоторые данные с камеры в режиме реального времени, используя OpenCV. Тем не менее, построение графиков в режиме реального времени (с использованием matplotlib), похоже, не работает.
Я выделил проблему в этот простой пример:
fig = plt.figure()
plt.axis([0, 1000, 0, 1])
i = 0
x = list()
y = list()
while i < 1000:
temp_y = np.random.random()
x.append(i)
y.append(temp_y)
plt.scatter(i, temp_y)
i += 1
plt.show()
Я ожидал бы, что этот пример построит 1000 пунктов отдельно. На самом деле происходит то, что окно всплывает с показом первой точки (хорошо с этим), затем ждет окончания цикла, прежде чем заполнить остальную часть графика.
Есть мысли, почему я не вижу населенных пунктов по одному?
plt.axis()
а вместо этого создать два списка x и y и вызватьplt.plot(x,y)
2. в цикле, добавить новые значения данных в два списка 3. вызовplt.gca().lines[0].set_xdata(x); plt.gca().lines[0].set_ydata(y); plt.gca().relim(); plt.gca().autoscale_view(); plt.pause(0.05);
Если вы заинтересованы в построении графиков в реальном времени, я бы порекомендовал изучить API анимации matplotlib . В частности, использование,
blit
чтобы избежать перерисовки фона на каждом кадре, может дать вам существенное увеличение скорости (~ 10x):Вывод:
источник
plt.show()
иplt.draw()
. Я добавил эти изменения в код выше.blit()
очень похоже на« улучшение построения графиков в реальном времени »? Если у вас есть разработчик / блог matplotlib, обсуждающий причину / цель / намерение / мотивацию, это было бы здорово. (похоже, что эта новая операция blit преобразует Matplotlib из использования только для автономных или очень медленно изменяющихся данных, и теперь вы можете использовать Matplotlib с очень быстрым обновлением данных ... почти как осциллограф).Я знаю, что немного опоздал, чтобы ответить на этот вопрос. Тем не менее, некоторое время назад я сделал некоторый код для построения графиков, которыми я хотел бы поделиться:
Код для PyQt4:
Я недавно переписал код для PyQt5.
Код для PyQt5:
Просто попробуйте. Скопируйте и вставьте этот код в новый python-файл и запустите его. Вы должны получить красивый, плавно движущийся график:
источник
dataSendLoop
поток продолжает работать в фоновом режиме, когда вы закрываете окно. Поэтому я добавилdaemon = True
ключевое слово, чтобы решить эту проблему.conda install pyqt=4
сделали свое дело.show
вероятно, не лучший выбор для этого. То, что я хотел бы сделать, это использоватьpyplot.draw()
вместо этого. Вы также можете включить небольшую задержку (например,time.sleep(0.05)
) в цикл, чтобы вы могли видеть происходящие графики. Если я внесу эти изменения в ваш пример, это сработает для меня, и я увижу, что каждая точка появляется по одному.источник
Ни один из методов не работал для меня. Но я нашел это график Matplotlib в реальном времени не работает, пока еще в цикле
Все, что вам нужно, это добавить
и тогда вы сможете увидеть новые участки.
Так что ваш код должен выглядеть так, и он будет работать
источник
Лучшие (и многие другие) ответы были основаны на этом
plt.pause()
, но это был старый способ анимации сюжета в matplotlib. Это не только медленно, но и заставляет фокусироваться на каждом обновлении (мне было трудно остановить процесс создания Python для черчения).TL; DR: вы можете использовать
matplotlib.animation
( как указано в документации ).После поиска различных ответов и фрагментов кода это фактически оказалось для меня гладким способом бесконечного рисования входящих данных.
Вот мой код для быстрого начала. Он отображает текущее время со случайным числом в [0, 100) каждые 200 мс бесконечно, а также обрабатывает автоматическое изменение масштаба представления:
Вы также можете исследовать
blit
для еще лучшей производительности, как в документации FuncAnimation .Пример из
blit
документации:источник
for i in range(1000): x,y = some func_func()
. Здесьsome_func()
генерируетx,y
пары данных онлайн , которые я хотел бы построить, когда они будут доступны. Возможно ли это сделать с помощьюFuncAnimation
. Моя цель - построить кривую, определяемую данными, шаг за шагом с каждой итерацией.pyploy.show()
должен заблокировать. Если вы хотите добавить данные, восстановите их и обновите вupdate
функции.pyplot.show
цикл, цикл будет заблокирован этим вызовом и не будет продолжаться. Если вы хотите добавлять данные к кривой шаг за шагом, вставьте свою логикуupdate
, которая будет вызываться каждый,interval
так что это также шаг за шагом.Я знаю, что этот вопрос старый, но теперь на GitHub есть пакет, называемый drawnow как «python-drawnow». Это обеспечивает интерфейс, похожий на Drawnow MATLAB - вы можете легко обновить фигуру.
Пример для вашего варианта использования:
python-drawnow - это тонкая оболочка,
plt.draw
но она предоставляет возможность подтверждения (или отладки) после отображения рисунка.источник
Кажется, проблема в том, что вы ожидаете
plt.show()
показать окно, а затем вернуться. Это не делает этого. Программа остановится в этой точке и возобновит работу только после закрытия окна. Вы должны быть в состоянии проверить это: если вы закроете окно, а затем появится другое окно.Чтобы решить эту проблему, просто позвоните
plt.show()
один раз после цикла. Тогда вы получите полный сюжет. (Но не «в реальном времени»)Вы можете попробовать установить ключевое слово-аргумент
block
следующим образом:plt.show(block=False)
один раз в начале, а затем использовать.draw()
для обновления.источник
Вот версия, которую я получил для работы в моей системе.
Строка drawnow (makeFig) может быть заменена на makeFig (); Последовательность plt.draw (), и она все еще работает нормально.
источник
Если вы хотите рисовать, а не замораживать поток, так как рисуется больше точек, вы должны использовать plt.pause (), а не time.sleep ()
Я использую следующий код, чтобы построить серию координат XY.
источник
Другой вариант - пойти с боке . ИМО, это хорошая альтернатива, по крайней мере, для графиков в реальном времени. Вот боке-версия кода в вопросе:
и для запуска:
Боке показывает результат в веб-браузере через веб-сокет связи. Это особенно полезно, когда данные генерируются процессами удаленного безголового сервера.
источник
Пример варианта использования для отображения загрузки процессора в режиме реального времени.
источник