Con Matplotlib precedente alla versione 1.0.1, show()
should only be called once per program, anche se sembra funzionare all'interno di determinati ambienti (alcuni backend, su alcune piattaforme, ecc.).
La funzione disegno rilevante è effettivamente draw()
:
import matplotlib.pyplot as plt
plt.plot(range(10)) # Creates the plot. No need to save the current figure.
plt.draw() # Draws, but does not block
raw_input() # This shows the first figure "separately" (by waiting for "enter").
plt.figure() # New window, if needed. No need to save it, as pyplot uses the concept of current figure
plt.plot(range(10, 20))
plt.draw()
# raw_input() # If you need to wait here too...
# (...)
# Only at the end of your program:
plt.show() # blocks
È importante riconoscere che show()
è un ciclo infinito, progettato per gestire gli eventi in varie figure (ridimensionare, ecc). Nota che, in linea di principio, le chiamate a draw()
sono facoltative se chiami matplotlib.ion()
all'inizio del tuo script (ho visto che questo errore su alcune piattaforme e backend, però).
Non penso che Matplotlib offra un meccanismo per creare una figura e opzionalmente visualizzarla; questo significa che verranno visualizzate tutte le cifre create con figure()
. Se hai solo bisogno di visualizzare sequenzialmente figure separate (o nella stessa finestra o no), puoi fare come nel codice sopra.
Ora, la soluzione di cui sopra potrebbe essere sufficiente in casi semplici e per alcuni back-end Matplotlib. Alcuni backend sono abbastanza piacevoli da permetterti di interagire con la prima cifra anche se non hai chiamato show()
. Ma, per quanto ho capito, non devono essere gentili. L'approccio più efficace sarebbe quello di avviare ciascuna figura in un thread separato, con un finale show()
in ciascun thread. Credo che questo sia essenzialmente ciò che fa IPython.
Il codice precedente dovrebbe essere sufficiente la maggior parte del tempo.
PS: ora, con Matplotlib versione 1.0.1+, show()
può essere chiamato più volte (con la maggior parte dei backend).
Solo un consiglio: in genere non è necessario salvare le figure (in f1, f2), poiché Matplotlib disegna nella figura * corrente *, che è generalmente l'ultima figura creata. – EOL
@EOL, cosa succede se voglio disegnare sulla prima cifra? – Alcott
Esistono vari modi per scrivere di nuovo una figura senza salvarla prima in una variabile. Ad esempio, tutte le figure hanno un "numero" (che può essere un numero o una stringa). Per impostazione predefinita, le cifre ricevono un numero. Pertanto, 'figure (1)' rende attiva la prima figura, ecc. In alternativa, puoi creare una figura (senza salvarla) con 'figure ('rank')' e quindi renderla attiva più tardi con 'figure (' rango ') '. Detto questo, il punto del mio commento è stato che nel caso di questa domanda, non è assolutamente necessario salvare le figure, poiché 'plot()' agisce sulla figura corrente (l'ultima creata, qui). – EOL