ventanas tutorial para interfaz impacientes gui grafica funciones botones python matplotlib pyqt vispy

tutorial - ¿Cómo muestro los gráficos en tiempo real en una interfaz de usuario simple para un programa de python?



python ventanas botones (4)

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

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

(Voy a dejar esta pregunta abierta por un día o dos porque me cuesta evaluar las soluciones sin mucha más experiencia que no tengo. Con suerte, los votos de la comunidad ayudarán a elegir la mejor respuesta).


Ouh, ahora veamos, cuando dices en tiempo real que quieres decir que quieres una frecuencia de actualización superior a 5 Hz matplotlib no hará el trabajo. Tuve este problema antes, fui a PyQwt que funciona con PyQt.


Para el trazado en tiempo real, recomiendo probar Chaco, pyqtgraph o cualquiera de las bibliotecas basadas en opengl como glumpy o visvis. Matplotlib, por maravilloso que sea, generalmente no es adecuado para este tipo de aplicación.

Edición: los desarrolladores de glumpy, visvis, galry y pyqtgraph están colaborando en una biblioteca de visualización llamada vispy . Todavía es temprano en el desarrollo, pero prometedor y ya bastante poderoso.


Recomiendo usar matplotlib en modo interactivo, si llama .show una vez, aparecerá en su propia ventana, si no lo hace, entonces solo existe en la memoria y puede escribirse en un archivo cuando haya terminado.


Edit: Hoy en día, es más fácil y mejor usar 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()

Hay un ejemplo de hacer un gráfico animado here . Sobre la base de este ejemplo, puede intentar 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()

De esta manera, puedo obtener aproximadamente 14 cuadros por segundo, en comparación con 4 cuadros por segundo utilizando el código que publiqué por primera vez . El truco es evitar pedirle a matplotlib que dibuje figuras completas. En su lugar, llame a plt.hist una vez, luego manipule los matplotlib.patches.Rectangle s existentes en los patches para actualizar el histograma, y ​​llame a fig.canvas.draw() para hacer visibles las actualizaciones.