Estoy tratando de trazar algunos datos de una cámara en tiempo real usando OpenCV. Sin embargo, el trazado en tiempo real (usando matplotlib) no parece estar funcionando.
He aislado el problema en este simple ejemplo:
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()
Esperaría que este ejemplo trazara 1000 puntos individualmente. Lo que realmente sucede es que la ventana aparece con el primer punto que se muestra (está bien con eso), luego espera a que finalice el bucle antes de llenar el resto del gráfico.
¿Alguna idea de por qué no veo puntos poblados uno a la vez?
plt.axis()
sino que cree dos listas x e y y llameplt.plot(x,y)
2. en su bucle, agregue nuevos valores de datos a las dos listas 3. llamarplt.gca().lines[0].set_xdata(x); plt.gca().lines[0].set_ydata(y); plt.gca().relim(); plt.gca().autoscale_view(); plt.pause(0.05);
Si está interesado en el trazado en tiempo real, le recomiendo que busque en la API de animación de matplotlib . En particular, usar
blit
para evitar volver a dibujar el fondo en cada cuadro puede brindarle ganancias de velocidad sustanciales (~ 10x):Salida:
fuente
plt.show()
yplt.draw()
. He agregado estos cambios al código anterior.blit()
parece ser "mejorar la trama en tiempo real"? Si tiene un desarrollador / blog matplotlib discutiendo el por qué / propósito / intención / motivación, sería genial. (parece que esta nueva operación blit convertiría Matplotlib de usar solo para datos fuera de línea o que cambian muy lentamente, ahora puede usar Matplotlib con datos de actualización muy rápidos ... casi como un osciloscopio).Sé que llego un poco tarde para responder esta pregunta. Sin embargo, hice un código hace un tiempo para trazar gráficos en vivo, que me gustaría compartir:
Código para PyQt4:
Recientemente reescribí el código para PyQt5.
Código para PyQt5:
Solo pruébalo. Copie y pegue este código en un nuevo archivo python y ejecútelo. Debería obtener un gráfico hermoso y de movimiento suave:
fuente
dataSendLoop
hilo seguía ejecutándose en segundo plano cuando cierras la ventana. Entonces agregué ladaemon = True
palabra clave para resolver ese problema.conda install pyqt=4
hizo el truco.show
Probablemente no sea la mejor opción para esto. Lo que haría es usarpyplot.draw()
en su lugar. También es posible que desee incluir un pequeño retraso de tiempo (p. Ej.,time.sleep(0.05)
) En el bucle para que pueda ver los gráficos que ocurren. Si realizo estos cambios en su ejemplo, funciona para mí y veo que cada punto aparece uno a la vez.fuente
Ninguno de los métodos funcionó para mí. Pero he encontrado que este diagrama de matplotlib en tiempo real no funciona mientras todavía está en un bucle
Todo lo que necesitas es agregar
y luego podías ver las nuevas parcelas.
Entonces su código debería verse así, y funcionará
fuente
Las respuestas principales (y muchas otras) se
plt.pause()
basaron, pero esa era una antigua forma de animar la trama en matplotlib. No solo es lento, sino que también hace que se enfoque en cada actualización (tuve dificultades para detener el proceso de trazado de Python).TL; DR: es posible que desee utilizar
matplotlib.animation
( como se menciona en la documentación ).Después de buscar varias respuestas y fragmentos de código, de hecho, resultó ser una forma fluida de extraer datos entrantes infinitamente para mí.
Aquí está mi código para un inicio rápido. Traza la hora actual con un número aleatorio en [0, 100) cada 200 ms infinitamente, al tiempo que maneja el cambio de escala automático de la vista:
También puede explorar
blit
para obtener un rendimiento aún mejor, como en la documentación de FuncAnimation .Un ejemplo de la
blit
documentación:fuente
for i in range(1000): x,y = some func_func()
. Aquísome_func()
generax,y
pares de datos en línea , que me gustaría trazar una vez que estén disponibles. ¿Es posible hacer esto conFuncAnimation
? Mi objetivo es construir la curva definida por los datos paso a paso con cada iteración.pyploy.show()
debería bloquear. Si desea agregar datos, recupérelos y actualícelos en laupdate
función.pyplot.show
en un bucle, el bucle será bloqueado por esta llamada y no continuará. Si desea agregar datos a la curva paso a paso, ingrese su lógicaupdate
, que se llamará cada uno,interval
por lo que también es paso a paso.Sé que esta pregunta es antigua, pero ahora hay un paquete disponible llamado drawnow en GitHub como "python-drawnow". Esto proporciona una interfaz similar al dibujo de MATLAB: puede actualizar fácilmente una figura.
Un ejemplo para su caso de uso:
python-drawnow es una envoltura delgada
plt.draw
pero proporciona la capacidad de confirmar (o depurar) después de la visualización de la figura.fuente
El problema parece ser que espera
plt.show()
mostrar la ventana y luego regresar. No hace eso. El programa se detendrá en ese punto y solo se reanudará una vez que cierre la ventana. Debería poder probar eso: si cierra la ventana y luego aparece otra ventana emergente.Para resolver ese problema, solo llame
plt.show()
una vez después de su ciclo. Entonces obtienes la trama completa. (Pero no una "trama en tiempo real")Puede intentar establecer el argumento de palabra clave de
block
esta manera:plt.show(block=False)
una vez al principio y luego usar.draw()
para actualizar.fuente
Aquí hay una versión que pude trabajar en mi sistema.
La línea dibujada (makeFig) se puede reemplazar por un makeFig (); secuencia plt.draw () y aún funciona bien.
fuente
Si desea dibujar y no congelar su hilo a medida que se dibujan más puntos, debe usar plt.pause () no time.sleep ()
Estoy usando el siguiente código para trazar una serie de coordenadas xy.
fuente
Otra opción es ir con bokeh . En mi opinión, es una buena alternativa al menos para tramas en tiempo real. Aquí hay una versión bokeh del código en la pregunta:
y para ejecutarlo:
bokeh muestra el resultado en un navegador web a través de comunicaciones websocket. Es especialmente útil cuando los datos son generados por procesos remotos del servidor sin cabeza.
fuente
Un ejemplo de caso de uso para trazar el uso de la CPU en tiempo real.
fuente