Perché molti esempi usano `fig, ax = plt.subplots ()` in Matplotlib / pyplot / python


267

Sto imparando a usare matplotlibstudiando esempi, e molti esempi sembrano includere una riga come la seguente prima di creare un singolo diagramma ...

fig, ax = plt.subplots()

Ecco alcuni esempi...

Vedo che questa funzione viene utilizzata molto, anche se l'esempio sta solo tentando di creare un singolo grafico. C'è qualche altro vantaggio? La demo ufficiale per subplots()usa anche f, ax = subplotsquando si crea un singolo grafico, e fa sempre riferimento a ax solo dopo. Questo è il codice che usano.

# Just a figure and one subplot
f, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')

11
beh, è ​​breve, conciso e ottieni un riferimento due sia in figura che in asse in un unico passaggio. È pitonico, perché è bello :)
cel

Risposte:


325

plt.subplots()è una funzione che restituisce una tupla contenente una figura e gli oggetti degli assi. Quindi quando si utilizza fig, ax = plt.subplots()scompattare questa tupla nelle variabili fige ax. Avere figè utile se si desidera modificare gli attributi a livello di figura o salvare la figura come file immagine in un secondo momento (ad es. Con fig.savefig('yourfilename.png')). Certamente non è necessario utilizzare l'oggetto figura restituito, ma molte persone lo usano in seguito, quindi è normale vederlo. Inoltre, tutti gli oggetti degli assi (gli oggetti che hanno metodi di stampa) hanno comunque un oggetto figura genitore, quindi:

fig, ax = plt.subplots()

è più conciso di questo:

fig = plt.figure()
ax = fig.add_subplot(111)

8
Ottima spiegazione Ecco il documento su di esso - matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplots
bretcj7

2
Perché usiamo sempre 111 come parametro nella sottotrama?
Priyansh,

@Priyansh perché ereditato dalla sintassi di Matlab
pcko1

@Priyansh Non sempre. Se vuoi 4 grafici, puoi farlo ax11, ax12, ax21, ax22usando fig.add_subplot(221)(o rispettivamente 222, 223, 224).
Guimoute,

49

Solo un supplemento qui.

La seguente domanda è che cosa succede se voglio più sottotrame nella figura?

Come menzionato nel documento, possiamo usare fig = plt.subplots(nrows=2, ncols=2) per impostare un gruppo di sottotrame con griglia (2,2) in un oggetto figura.

Quindi, come sappiamo, fig, ax = plt.subplots()restituisce una tupla, proviamo fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2)innanzitutto.

ValueError: not enough values to unpack (expected 4, got 2)

Genera un errore, ma non preoccuparti, perché ora vediamo che in plt.subplots()realtà restituisce una tupla con due elementi. Il primo deve essere un oggetto figura e l'altro dovrebbe essere un gruppo di oggetti della trama secondaria.

Quindi proviamo di nuovo:

fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(nrows=2, ncols=2)

e controlla il tipo:

type(fig) #<class 'matplotlib.figure.Figure'>
type(ax1) #<class 'matplotlib.axes._subplots.AxesSubplot'>

Naturalmente, se si utilizzano i parametri come (nrows = 1, ncols = 4), il formato dovrebbe essere:

fig, [ax1, ax2, ax3, ax4] = plt.subplots(nrows=1, ncols=4)

Quindi ricorda di mantenere la costruzione dell'elenco uguale alla griglia delle sottotrame che abbiamo impostato nella figura.

Spero che questo possa esserti utile.


2
non dimenticare di aggiungere plt.tight_layout () se le tue sottotrame hanno titoli
gota

12
Che cosa succede se si hanno molti sottotrame? È più facile farlo in questo modo: fig, axes = plt.subplots(nrows=10, ncols=3)e axes = axes.flatten(). Ora è possibile fare riferimento a ogni sottotrama dal suo indice: axes[0], axes[1], ...
Guillaume

Cosa succede se desidero che una di queste sottotrame si estenda su più colonne o righe? è fattibile con il comando subplots?
Gota,

1
@BallpointBen Non sono sicuro che nrows=1funzioni se , come allora, axesviene restituito piatto con lunghezza uguale ancols
Ben

1
@BallpointBen Ho appena realizzato che puoi risolvere il problema facendo:fig, axes = plt.subplots(nrows=1, ncols=3, squeeze=False)
Ben

15

Come supplemento alla domanda e alle risposte precedenti c'è anche un'importante differenza tra plt.subplots()e plt.subplot(), notare la mancanza 's'alla fine.

Si può usare plt.subplots()per creare tutte le loro sottotrame contemporaneamente e restituisce la figura e gli assi (plurale dell'asse) delle sottotrame come tupla. Una figura può essere intesa come una tela in cui dipingi il tuo schizzo.

# create a subplot with 2 rows and 1 columns
fig, ax = plt.subplots(2,1)

Considerando che, è possibile utilizzare plt.subplot()se si desidera aggiungere le sottotrame separatamente. Restituisce solo l'asse di una sottotrama.

fig = plt.figure() # create the canvas for plotting
ax1 = plt.subplot(2,1,1) 
# (2,1,1) indicates total number of rows, columns, and figure number respectively
ax2 = plt.subplot(2,1,2)

Tuttavia, plt.subplots()è preferito perché ti dà le opzioni più facili per personalizzare direttamente l'intera figura

# for example, sharing x-axis, y-axis for all subplots can be specified at once
fig, ax = plt.subplots(2,2, sharex=True, sharey=True)

Assi condivisi mentre, con plt.subplot(), si dovrà specificare individualmente per ciascun asse che può diventare ingombrante.


1
la tua linea di codice ax3 = plt.subplot(2,1,3) non funzionerà perché è 2 per 1, che ha solo 2 grafici.
Cloud Cho

1
grazie, risolto. C'era un'altra modifica necessaria nell'ultimo blocco di codice.
Light_B

3

Oltre alle risposte sopra, puoi controllare il tipo di oggetto usando il type(plt.subplots())quale restituisce una tupla, d'altro canto, type(plt.subplot())restituisce matplotlib.axes._subplots.AxesSubplotche non puoi decomprimere.


4
Benvenuto in Stack Overflow! Questo è davvero un commento, non una risposta. Con un po 'più di rappresentante, sarai in grado di pubblicare commenti . Grazie!
Miroslav Glamuzina,
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.