2011-11-21 18 views
5

Capisco come visualizzare i grafici matplotlib sullo schermo utilizzando l'interfaccia pyplot (credo!). Ho iniziato a disegnare in un programma multi-thread e questo ha iniziato a causare errori, quindi sto provando a passare all'interfaccia orientata agli oggetti. Posso creare una trama semplice e salvarla in file usandoTraccia grafici sullo schermo utilizzando l'API matplotlib

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
from matplotlib.figure import Figure 

fig = Figure() 
can = FigureCanvas(fig) 
ax = fig.add_subplot(111) 
ax.plot((1,2,3)) 
can.print_figure('test') 

Ma come visualizzare questo grafico sullo schermo? Ho visto altro codice che utilizza can.draw() ma che non ha alcun effetto.

Inoltre, per favore fatemi sapere se c'è qualcosa di subottimale sul mio codice qui sopra - Non ho davvero preso confidenza con quello che tutti questi oggetti di figura, tela e assi fanno ancora.

risposta

4

Il tuo problema è che si sta utilizzando un backend non interattiva (Agg piuttosto che TkAgg, GtkAgg, QtAgg, ecc). Per definizione, non supporta la visualizzazione sullo schermo.

Tuttavia, il lavoro con il codice multithread con qualsiasi libreria GUI richiede che il mainloop del gui venga eseguito nella sua stessa thread.

In altre parole, il passaggio a un back-end che può essere visualizzato sullo schermo richiederà un po 'più di complessità nel codice multithread.

Ci sono diversi modi per farlo, ma qualsiasi metodo generico sarà molto inefficiente. (La soluzione più semplice è quella di utilizzare pyplot.ion e quindi disegnare la tela ogni x millisecondi in un thread, mentre facendo altre cose in un altro thread. Questo è orribilmente inefficiente.)

si può dare un po 'più in dettaglio su ciò che si' stai facendo? Perché stai usando threading invece di multiprocessing? (cioè stai facendo un sacco di IO?) Quale libreria gui stai usando? (Se non lo sai, probabilmente è lo Tk, dato che è il back-end matplotlib predefinito.)

+0

Grazie mille per il tuo aiuto. Non avevo capito che la risposta sarebbe stata specifica per il back-end (ho cercato di capire cosa stava facendo 'pyplot.show()', ma non ho trovato il codice pertinente). Ho trovato [questo] (http://matplotlib.sourceforge.net/examples/user_interfaces/embedding_in_tk.html) esempio per Tk, che è molto utile. La citazione del multithreading era probabilmente un'aringa rossa: avevo solo del codice che faceva un po 'di numeri e ho salvato alcuni grafici con Pyplot, ho provato a spostarlo in un thread in modo da poter vedere i suoi risultati mentre era in esecuzione, e ottenere un sacco di strani errori. – James

Problemi correlati