Come faccio a dire a Matplotlib di creare una seconda (nuova) trama, e successivamente quella precedente?


147

Voglio tracciare i dati, quindi creare una nuova figura e tracciare i dati2 e infine tornare alla trama originale e tracciare i dati3, un po 'così:

import numpy as np
import matplotlib as plt

x = arange(5)
y = np.exp(5)
plt.figure()
plt.plot(x, y)

z = np.sin(x)
plt.figure()
plt.plot(x, z)

w = np.cos(x)
plt.figure("""first figure""") # Here's the part I need
plt.plot(x, w)

Cordiali saluti Come faccio a dire a matplotlib che ho finito con una trama? fa qualcosa di simile, ma non del tutto! Non mi consente di accedere a quella trama originale.

Risposte:


152

Se ti ritrovi a fare cose del genere regolarmente, può valere la pena di esaminare l'interfaccia orientata agli oggetti su matplotlib. Nel tuo caso:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = np.exp(x)
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_title("Axis 1 title")
ax1.set_xlabel("X-label for axis 1")

z = np.sin(x)
fig2, (ax2, ax3) = plt.subplots(nrows=2, ncols=1) # two axes on figure
ax2.plot(x, z)
ax3.plot(x, -z)

w = np.cos(x)
ax1.plot(x, w) # can continue plotting on the first axis

È un po 'più dettagliato ma è molto più chiaro e più facile da tenere traccia, soprattutto con diverse figure ognuna con più sottotrame.


2
Preferisco l'approccio orientato agli oggetti, poiché quando prevedo di avere molte figure, sarà più facile tenerne traccia utilizzando nomi anziché numeri. Grazie!
Peter D,

1
Ma come si possono cambiare i limiti di etichetta e asse con questo approccio. Se lo uso ax1.ylabeldice che non è stato trovato. Lo stesso con fig1.ylabel...
George Datseris,

3
@GeorgeDatseris La sintassi è leggermente diversa. E ' ax1.set_xlabel("your x label"), ax1.set_ylabel("your y label")e ax1.set_title("your title").
simonb,

1
perché hai usato 111?
Yash Sodha,

2
@yashSodha: è una specifica in stile matlab del numero di sottotrame (righe, colonne, indice). Ma ora è molto più facile da usare plt.subplots(nrows, ncols). Ho aggiornato l'esempio.
simonb,

120

Quando chiami figure, numera semplicemente la trama.

x = arange(5)
y = np.exp(5)
plt.figure(0)
plt.plot(x, y)

z = np.sin(x)
plt.figure(1)
plt.plot(x, z)

w = np.cos(x)
plt.figure(0) # Here's the part I need
plt.plot(x, w)

Modifica: Nota che puoi numerare i grafici come vuoi (qui, a partire da 0) ma se non fornisci la cifra con un numero quando ne crei uno nuovo, la numerazione automatica inizierà da 1("Stile Matlab" secondo ai documenti).


3
Questo sembra funzionare nella modalità interattiva di matplotlib, mentre il metodo figure () ... add_subplot () no. Grazie!
chbrown

@SebMa Non modificare il codice senza capirlo. Questa risposta riguardava specificamente il passaggio di un numero a figure, che è stato rimosso. Le altre cose che hai cambiato sono state copiate dal post originale e non errori nella mia risposta.
AGF

@agf Ciao, ho rimosso l' 1interno plt.figure(1)perché pensavo che il numero fosse auto-incrementato e quindi non necessario. Scusate.
SebMa,

18

Tuttavia, la numerazione inizia alle 1, quindi:

x = arange(5)
y = np.exp(5)
plt.figure(1)
plt.plot(x, y)

z = np.sin(x)
plt.figure(2)
plt.plot(x, z)

w = np.cos(x)
plt.figure(1) # Here's the part I need, but numbering starts at 1!
plt.plot(x, w)

Inoltre, se su una figura sono presenti più assi, ad esempio i grafici secondari, utilizzare il axes(h)comando in cui si htrova la maniglia dell'oggetto assi desiderato per mettere a fuoco su quegli assi.

(non hai ancora i privilegi di commento, scusami per la nuova risposta!)


10
0funziona, la numerazione automatica inizia da alle 1, se non gli dai affatto un numero.
agf

0

Un modo che ho trovato dopo alcune difficoltà è la creazione di una funzione che ottiene la matrice di data_plot, il nome del file e l'ordine come parametro per creare grafici a scatole dai dati dati nella figura ordinata (ordini diversi = figure diverse) e salvarli con il nome file specificato.

def plotFigure(data_plot,file_name,order):
    fig = plt.figure(order, figsize=(9, 6))
    ax = fig.add_subplot(111)
    bp = ax.boxplot(data_plot)
    fig.savefig(file_name, bbox_inches='tight')
    plt.close()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.