2009-08-02 12 views
9

strano comportamento, sono sicuro che sono io strizzando, ma mi piacerebbe andare a fondo di ciò che sta succedendo:Python Matplotlib si blocca quando viene chiesto di tracciare un secondo grafico (dopo aver chiuso prima finestra del grafico)

sto facendo funzionare il seguente codice per creare una semplice finestra grafico utilizzando matplotlib:

>>> import matplotlib.pyplot as plt 
>>> fig = plt.figure() 
>>> ax = fig.add_subplot(111) 
>>> ax.plot((1, 3, 1)) 
[<matplotlib.lines.Line2D object at 0x0290B750>] 
>>> plt.show() 

e come previsto ottengo il grafico ci si aspetterebbe, in una nuova finestra che è spuntato, che contiene una semplice linea blu andare da 1 a 3 di nuovo a 1 di nuovo sull'asse y, con 0, 1, 2 come punti dell'asse x (proprio come nell'esempio). Ora chiudo la finestra del grafico (usando il pulsante croce in alto a destra sotto Windows). Questo mi dà il controllo per l'interprete, e mi metto di nuovo, la creazione di nuovi oggetti:

>>> 
>>> fig1 = plt.figure() 
>>> bx = fig1.add_subplot(111) 
>>> bx.plot((1, 3, 1)) 
[<matplotlib.lines.Line2D object at 0x029E8210>] 
>>> plt.show() 

Questa volta, però, ho un telaio di una finestra, con niente in esso (solo il telaio, senza sfondo bianco nulla), e l'intero colpo è sospeso. Devo "terminare l'attività", l'interprete python è terminato dal sistema e ottengo un prompt dei comandi. Comportamento simile su un mac (tranne che in realtà traccia il grafico prima, prima di appenderlo).

Quindi in qualche modo Python e/o Matplotlib non vogliono che chiuda la finestra manualmente. Qualcuno sa cosa sta succedendo e cosa dovrei fare? Quello che mi piacerebbe fare è giocare con trame diverse all'interno dell'interprete, e ovviamente questo comportamento non aiuta. So che potrei usare "Ipython -pylab" ma nell'interesse dell'apprendimento, voglio capire l'errore sopra riportato.

Grazie.

risposta

2

Apparentemente, questo è causato da un bug nel backend di tkinter. Vedi, ad esempio, https://bugs.launchpad.net/ubuntu/+source/matplotlib/+bug/313834. Si sta lavorando su ... Se si riesce a regredire in una libreria tkinter un po 'più vecchia, dovrebbe essere una soluzione per il tempo (mi sono imbattuto in questa stessa cosa un paio di settimane fa, e quella era la mia unica speranza).

0

Hai provato:

plt.close() 

per assicurarsi che hai chiuso l'oggetto trama?

+0

che ho ora Casey, ma nessun cambiamento. Quando chiamo plt.show(), mostra che la finestra del grafico dall'interprete Python è fuori uso, cioè non ho un prompt. Solo quando chiudo la finestra ottengo il prompt indietro. Se poi chiamo plt.close() e poi proseguo, si comporta esattamente nello stesso modo, cioè si blocca. Ottenere la sensazione (scavando attorno al sito Web di Matplotlib) che in pratica vogliono che tu ti leghi a iPython in modalità -pylab. –

+0

prova a scaricare scipy, se non ce l'hai già e importa pylab. funziona proprio come Matplotlib. – Nope

+0

No - niente neanche. Se import pylab, e fai tutto quanto sopra, si comporta esattamente allo stesso modo. –

2

Hai provato a utilizzare ipython anziché l'interprete python standard?

È possibile installare ipython con il seguente comando:

easy_install ipython 

e poi, ipython ha una modalità specifica per essere eseguito con pylab, chiamato -pylab:

ipython -pylab 

In[1]: ... 

penso che la maggior parte delle le persone usano questa soluzione per tracciare grafici con python, è una riga di comando simile a quella di R/Matlab, completamento, ecc ... ed esegue un thread separato per ogni trama quindi non dovrebbe avere il problema che hai descritto.

+0

Grazie - sì, conosco la rotta Ipython (vedi i commenti sopra). In effetti sembra che questa sia la strada da percorrere, anche se anche questo può essere un po 'imprevedibile. Penso che tu abbia ragione però. Basicall Ipython è la via da seguire. –

8

Tre mesi di ritardo alla festa, ma ho trovato un suggerimento nella documentazione di matlibplot per usare draw() piuttosto che show(); il primo a quanto pare fa solo un rendering dell'attuale trama, mentre il secondo avvia tutti gli strumenti interattivi, che è dove i problemi sembrano iniziare.

non è terribilmente in evidenza nella documentazione, ma ecco il link: pylab.show http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show

Per quello che vale, ho provato() e aveva esattamente lo stesso problema che hai fatto, mentre pylab. draw() sembra funzionare bene se voglio solo vedere l'output.

+0

Grazie Ricco - utile. Tre mesi non è troppo tardi, perché ora sono tornato in matplotlib dopo un po 'di pausa. –

+0

Grazie per il link. Sono sempre stato confuso su show() e draw() e alla fine trovo delle buone informazioni a riguardo. – Viktiglemma

+0

È il 2014 con Matplotlib 1.4 e questa risposta è ancora pertinente. – SkyNT

0

Come ha scritto da qualche parte sopra:

Usa plt.draw() per tutte le trame, tranne l'ultimo.

Per la vostra ultima trama, utilizzare plt.show()

E 'strano, ma se non si utilizza plt.show() nel l'ultimo e tenta plt.draw() invece, non si vede alcun trame.

Buona fortuna con questo!

0

Ho riscontrato questo problema durante l'utilizzo di TkAgg come back-end. Dopo aver usato plt.close('all') il mio computer si è bloccato.

La soluzione era passare a un back-end diverso. Ora utilizzo invece Qt4Agg.

Se hai Qt4Agg installed è possibile passare backend digitando:

plt.switch_backend('Qt4Agg') 

prima di tracciare i dati

Problemi correlati