2010-03-07 14 views
36

Dire che ho due figure in matplotlib, con una trama da figura:Come posso visualizzare le figure separatamente in matplotlib?

import matplotlib.pyplot as plt 

f1 = plt.figure() 
plt.plot(range(0,10)) 
f2 = plt.figure() 
plt.plot(range(10,20)) 

Poi mi mostrano sia in un solo colpo

plt.show() 

Esiste un modo per mostrare loro a parte, vale a dire per mostrare solo f1?

O meglio: come posso gestire le cifre a parte, come nel codice seguente 'desiderio' (che non funziona):

f1 = plt.figure() 
f1.plot(range(0,10)) 
f1.show() 
+1

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

+1

@EOL, cosa succede se voglio disegnare sulla prima cifra? – Alcott

+3

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

risposta

36

Certo. Aggiungi un Axes utilizzando add_subplot. (Edited import.) (Edited show.)

import matplotlib.pyplot as plt 
f1 = plt.figure() 
f2 = plt.figure() 
ax1 = f1.add_subplot(111) 
ax1.plot(range(0,10)) 
ax2 = f2.add_subplot(111) 
ax2.plot(range(10,20)) 
plt.show() 

alternativa, utilizzare add_axes.

ax1 = f1.add_axes([0.1,0.1,0.8,0.8]) 
ax1.plot(range(0,10)) 
ax2 = f2.add_axes([0.1,0.1,0.8,0.8]) 
ax2.plot(range(10,20)) 
+0

Questo è esattamente quello che sto cercando di fare, ma matplotlib.figure sembra un modulo, non una classe. Mi sto perdendo qualcosa? –

+0

colpa mia. Vedi modifica. Infatti, uso 'dalla figura dell'importazione di pylab' più spesso. Per qualche ragione, 'pylab.figure' restituisce una figura con il metodo' show', ma 'matplotlib.figure.Figure' no. Hmm. –

+0

Uff .. :) Qui sto usando python 2.5.2 con matplotlib 0.98.1. f1.show() non fa nulla, mentre il secondo show() rimane bloccato. Probabilmente qualcosa non è configurato correttamente. Tuttavia, su un altro computer uso python 2.5.5 e matplotlib 0.99.1.1 e tutto funziona bene, quindi ... +1 e accettato, grazie mille. –

2

Forse è necessario leggere su interactive usage of Matplotlib. Tuttavia, se stai per creare un'app, dovresti utilizzare lo API e incorporare le figure nelle finestre del tuo kit di strumenti GUI prescelto (vedi examples/embedding_in_tk.py, ecc.).

21

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

+0

Modificato la mia risposta per usare il singolo 'show'. Continuo a preferire il modo manuale di salvare le singole maniglie degli assi e delle figure, perché trovo che ne ho spesso bisogno in seguito. Inoltre, questo è ciò che la domanda iniziale ha posto. –

+0

In realtà non è necessario dare un nome alle figure per visualizzarle in sequenza ... Se salvare il risultato di figure() o meno dipende realmente dalle proprie esigenze specifiche; Non lo salvo quasi mai. – EOL

+1

Ok, abbastanza giusto. Grazie per le informazioni aggiunte. –

Problemi correlati