Estoy creando una aplicación en Python que recopila datos de un puerto serie y traza un gráfico de los datos recopilados frente a la hora de llegada. La hora de llegada de los datos es incierta. Quiero que el gráfico se actualice cuando se reciban los datos. Busqué cómo hacer esto y encontré dos métodos:
- Limpia la trama y vuelve a dibujar la trama con todos los puntos.
- Anime la trama cambiándola después de un intervalo particular.
No prefiero el primero, ya que el programa se ejecuta y recopila datos durante mucho tiempo (un día, por ejemplo) y volver a dibujar el gráfico será bastante lento. El segundo tampoco es preferible ya que la hora de llegada de los datos es incierta y quiero que el gráfico se actualice solo cuando se reciban los datos.
¿Hay alguna forma en la que pueda actualizar el gráfico simplemente agregando más puntos solo cuando se reciben los datos?
python
matplotlib
tkinter
Shadman Anwer
fuente
fuente
Respuestas:
Hay varias formas de animar datos en matplotlib, dependiendo de la versión que tenga. ¿Has visto los ejemplos de libros de cocina de matplotlib ? Además, consulte los ejemplos de animación más modernos en la documentación de matplotlib. Finalmente, la API de animación define una función FuncAnimation que anima una función en el tiempo. Esta función podría ser simplemente la función que utiliza para adquirir sus datos.
Básicamente, cada método establece la
data
propiedad del objeto que se está dibujando, por lo que no requiere borrar la pantalla o la figura. Ladata
propiedad puede simplemente extenderse, por lo que puede mantener los puntos anteriores y seguir agregando a su línea (o imagen o lo que sea que esté dibujando).Dado que dice que la hora de llegada de sus datos es incierta, su mejor opción probablemente sea hacer algo como:
Luego, cuando reciba datos del puerto serie, simplemente llame
update_line
.fuente
Para hacer esto sin FuncAnimation (por ejemplo, si desea ejecutar otras partes del código mientras se produce el gráfico o desea actualizar varios gráficos al mismo tiempo), llamar
draw
por sí solo no produce el gráfico (al menos con el qt backend).Lo siguiente funciona para mí:
fuente
%matplotlib notebook
comando mágico después de su declaración de importación matplotlib.Aquí hay una forma que permite eliminar puntos después de un cierto número de puntos trazados:
fuente
Sé que llego tarde para responder a esta pregunta, pero para tu problema, puedes consultar el paquete "joystick". Lo diseñé para trazar un flujo de datos desde el puerto serie, pero funciona para cualquier flujo. También permite el registro de texto interactivo o el trazado de imágenes (además del trazado de gráficos). No es necesario que hagas tus propios bucles en un hilo separado, el paquete se encarga de ello, solo da la frecuencia de actualización que desees. Además, el terminal permanece disponible para controlar los comandos mientras se traza. Consulte http://www.github.com/ceyzeriat/joystick/ o https://pypi.python.org/pypi/joystick (use pip install joystick para instalar)
Simplemente reemplace np.random.random () por su punto de datos real leído desde el puerto serie en el siguiente código:
fuente