Я делаю приложение на Python, которое собирает данные из последовательного порта и строит график собранных данных в зависимости от времени прибытия. Время прибытия данных неизвестно. Я хочу, чтобы график обновлялся при получении данных. Я искал, как это сделать, и нашел два метода:
- Очистите график и заново начертите график со всеми точками.
- Анимируйте сюжет, изменяя его через определенный интервал.
Я не предпочитаю первый, так как программа работает и собирает данные долго (например, день), а перерисовка графика будет довольно медленной. Второй вариант также не является предпочтительным, так как время поступления данных неизвестно, и я хочу, чтобы график обновлялся только при получении данных.
Есть ли способ обновить график, просто добавив к нему больше точек, только когда данные получены?
python
matplotlib
tkinter
Шадман Анвер
источник
источник
Ответы:
Есть несколько способов анимировать данные в matplotlib, в зависимости от вашей версии. Вы видели примеры из кулинарной книги matplotlib ? Также ознакомьтесь с более современными примерами анимации в документации matplotlib. Наконец, API анимации определяет функцию FuncAnimation, которая анимирует функцию во времени. Эта функция может быть просто функцией, которую вы используете для сбора данных.
Каждый метод в основном устанавливает
data
свойство рисуемого объекта, поэтому не требует очистки экрана или рисунка.data
Свойство может просто быть продлен, так что вы можете сохранить предыдущие пункты и просто продолжать добавлять к вашей линии (или изображение , или все , что вы рисунок).Учитывая, что вы говорите, что время прибытия ваших данных не определено, лучше всего, вероятно, просто сделать что-то вроде:
Затем, когда вы получите данные из последовательного порта, просто позвоните
update_line
.источник
Чтобы сделать это без FuncAnimation (например, вы хотите выполнять другие части кода во время создания графика или вы хотите обновлять несколько графиков одновременно),
draw
только вызов не создает график (по крайней мере, с qt бэкэнд).Для меня работает следующее:
источник
%matplotlib notebook
волшебную команду после оператора импорта matplotlib.Вот способ, который позволяет удалить точки после нанесения определенного количества точек:
источник
Я знаю, что опаздываю с ответом на этот вопрос, но для решения вашей проблемы вы можете изучить пакет «джойстик». Я разработал его для построения потока данных из последовательного порта, но он работает для любого потока. Он также позволяет вести интерактивный журнал текста или строить изображения (в дополнение к построению графиков). Не нужно создавать собственные циклы в отдельном потоке, пакет позаботится об этом, просто укажите желаемую частоту обновления. Плюс терминал остается доступным для контроля команд во время черчения. См. Http://www.github.com/ceyzeriat/joystick/ или https://pypi.python.org/pypi/joystick (для установки используйте джойстик pip install)
Просто замените np.random.random () вашей реальной точкой данных, считанной из последовательного порта в приведенном ниже коде:
источник