¿Cómo puedo mostrar gráficos en tiempo real en una interfaz de usuario sencilla para un programa en Python?

StackOverflow https://stackoverflow.com/questions/4129697

  •  29-09-2019
  •  | 
  •  

Pregunta

tengo un complicado algoritmo que actualiza 3 histogramas que se almacenan en matrices. Quiero depurar mi algoritmo, así que estaba pensando de mostrar las matrices como histogramas en una interfaz de usuario. ¿Cuál es la manera más fácil de hacer esto. (Desarrollo rápido de aplicaciones es más importante que el código optimizado.)

Tengo alguna experiencia con Qt (en C ++) y algo de experiencia con matplotlib.

(voy a dejar esta cuestión abierta por un día o dos, porque es difícil para mí para evaluar las soluciones sin mucha más experiencia que yo no tengo. Con suerte, los votos de la comunidad ayudará a elegir la mejor respuesta .)

¿Fue útil?

Solución

Editar: Hoy en día, es más fácil y mejor para el uso matplotlib.animation:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation


def animate(frameno):
    x = mu + sigma * np.random.randn(10000)
    n, _ = np.histogram(x, bins, normed=True)
    for rect, h in zip(patches, n):
        rect.set_height(h)
    return patches    

mu, sigma = 100, 15
fig, ax = plt.subplots()
x = mu + sigma * np.random.randn(10000)
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='green', alpha=0.75)

ani = animation.FuncAnimation(fig, animate, blit=True, interval=10,
                              repeat=True)
plt.show()

No es un ejemplo de hacer una animación gráfica aquí . Basándose en este ejemplo, es posible que intente algo como:

import numpy as np
import matplotlib.pyplot as plt

plt.ion()
mu, sigma = 100, 15
fig = plt.figure()
x = mu + sigma*np.random.randn(10000)
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='green', alpha=0.75)
for i in range(50):
    x = mu + sigma*np.random.randn(10000)
    n, bins = np.histogram(x, bins, normed=True)
    for rect,h in zip(patches,n):
        rect.set_height(h)
    fig.canvas.draw()

Me puede obtener alrededor de 14 cuadros por segundo de esta manera, en comparación con 4 fotogramas por segundo utilizando el código I por primera vez. El truco es que no soliciten matplotlib para dibujar figuras completas. En lugar plt.hist llamada una vez, y luego manipular los matplotlib.patches.Rectangles existentes en patches para actualizar el histograma, y ??la llamada fig.canvas.draw() para hacer los cambios visibles.

Otros consejos

Para el trazado en tiempo real, recomiendo probar Chaco, pyqtgraph, o cualquiera de las bibliotecas basado en OpenGL como glumpy o visvis. Matplotlib, maravillosa como es, no es generalmente adecuado para este tipo de aplicación.

Editar los desarrolladores de glumpy, visvis, galry y pyqtgraph están colaborando en un librería de visualización llamado vispy . Todavía es temprano en el desarrollo, pero prometedor y ya bastante potente.

Le recomiendo usar matplotlib en modo interactivo, si se llama a .show vez entonces aparecerá en su propia ventana, si no lo hace, entonces sólo existe en la memoria y se puede escribir en un archivo cuando haya terminado con a él.

Ouh, ahora ve, cuando usted dice en tiempo real significa que usted quiere una frecuencia de actualización mayor que 5 Hz matplotlib no va a hacer el trabajo. He tenido este problema antes, fui por PyQwt que trabaja con PyQt.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top