Come faccio a visualizzare grafici in tempo reale in una semplice interfaccia utente per un programma Python?

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

  •  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 .)

È stato utile?

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.Rectangles 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top