Python Matplotlib si blocca quando viene chiesto di tracciare un secondo diagramma (dopo aver chiuso la prima finestra del diagramma)

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

  •  10-07-2019
  •  | 
  •  

Domanda

Comportamento strano, sono sicuro che sono io a rovinare, ma mi piacerebbe arrivare alla fine di quello che sta succedendo:

Sto eseguendo il seguente codice per creare una finestra del grafico molto semplice 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 che ci si aspetterebbe, in una nuova finestra che è spuntata, contenente una linea blu molto semplice che va da 1 a 3 di nuovo a 1 di nuovo sull'asse y, con 0, 1, 2 come punti dell'asse x (solo come esempio). Ora chiudo la finestra del grafico (usando il pulsante croce in alto a destra sotto le finestre). Questo mi dà il controllo dell'interprete e ricomincio creando 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ò, ottengo una cornice della finestra, senza niente (solo la cornice, niente sfondo bianco niente) e l'intero blocco del botto si blocca. Devo "terminare l'attività", l'interprete python viene terminato dal sistema e mi viene restituito un prompt dei comandi. Comportamento simile su un mac (tranne che in realtà traccia il grafico prima, anche prima di appendere).

Quindi in qualche modo Python e / o matplotlib non vogliono che chiuda manualmente la finestra. 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.

È stato utile?

Soluzione

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

Altri suggerimenti

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

Non è terribilmente prominente nella documentazione, ma ecco il link: http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show

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

Hai provato a usare ipython invece dell'interprete standard di Python?

Puoi installare ipython con il seguente comando:

easy_install ipython

e quindi, ipython ha una modalità specifica da eseguire con pylab, chiamata -pylab:

ipython -pylab

In[1]: ...

Penso che la maggior parte delle persone usi 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.

hai provato:

plt.close()

per essere sicuro di aver chiuso l'oggetto trama?

Come pubblicato da qualche parte sopra:

Usa plt.draw () per tutti i tuoi grafici tranne l'ultimo.

Per la tua ultima trama, usa plt.show ()

È strano, ma se non usi plt.show () nell'ultimo e prova invece plt.draw () , non vedi eventuali grafici.

Buona fortuna con questo!

Ho avuto questo problema quando ho usato TkAgg come backend. Dopo aver usato plt.close ('all') il mio computer si è bloccato.

La soluzione era passare a un altro backend. Ora uso invece Qt4Agg.

Se hai Qt4Agg installato è possibile cambiare backend digitando:

plt.switch_backend('Qt4Agg')

prima di tracciare i dati

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