Come faccio a visualizzare grafici in tempo reale in una semplice interfaccia utente per un programma Python?
-
29-09-2019 - |
Domanda
ho un algoritmo complicato che aggiorna 3 istogrammi che sono memorizzati in array. Voglio eseguire il debug il mio algoritmo, quindi stavo pensando di mostrare gli array come istogrammi in un'interfaccia utente. Qual è il modo più semplice per farlo. (Sviluppo rapido delle applicazioni è più importante del codice ottimizzato.)
Ho una certa esperienza con Qt (in C ++) e una certa esperienza con matplotlib.
(ho intenzione di lasciare questa questione aperta per un giorno o due, perché è difficile per me valutare le soluzioni senza molta più esperienza che io non ho. Si spera, i voti della comunità aiuterà scegliere la risposta migliore .)
Soluzione
Modifica: Al giorno d'oggi, è più facile e meglio usare 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()
C'è un esempio di fare un animato grafico qui . Basandosi su questo esempio, si potrebbe provare qualcosa di simile:
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()
posso ottenere circa 14 fotogrammi al secondo in questo modo, rispetto a 4 fotogrammi al secondo utilizzando il codice che ho primo postato . Il trucco è quello di evitare di chiedere matplotlib a disegnare figure complete. Invece plt.hist
chiamata una volta, quindi manipolare i matplotlib.patches.Rectangle
s esistenti patches
per aggiornare l'istogramma, e chiamata
fig.canvas.draw()
per rendere gli aggiornamenti visibile.
Altri suggerimenti
per la stampa in tempo reale, vi consiglio di provare Chaco, pyqtgraph, o una qualsiasi delle librerie OpenGL-based come glumpy o visvis. Matplotlib, meraviglioso come è, non è generalmente adatto per questo tipo di applicazione.
Modifica gli sviluppatori di glumpy, visvis, galry e pyqtgraph sono tutti collaborano su una libreria di visualizzazione chiamato vispy . E 'ancora presto in fase di sviluppo, ma promettente e già molto potente.
Mi consiglia di utilizzare matplotlib in modalità interattiva, se si chiama .show
una volta, allora si aprirà in una finestra separata, se non lo fai, allora esiste solo nella memoria e possono essere scritti in un file quando hai finito con esso.
Ouh, ora vediamo, quando si dice in tempo reale che si significa che si vuole una frequenza di aggiornamento superiore a 5 Hz matplotlib non farà il lavoro. Ho avuto questo problema prima, sono andato per PyQwt che funziona con PyQt.