Come posso ottenere più sottotrame in matplotlib?


156

Sono un po 'confuso su come funziona questo codice:

fig, axes = plt.subplots(nrows=2, ncols=2)
plt.show()

Come funziona il fico, assi in questo caso? Che cosa fa?

Anche perché questo lavoro non dovrebbe fare la stessa cosa:

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

1
A partire dal matplotlib 2.1 secondo codice opere .
Paradosso di Fermi,

Risposte:


210

Ci sono molti modi per farlo. Il subplotsmetodo crea la figura insieme ai grafici secondari che vengono quindi memorizzati axnell'array. Per esempio:

import matplotlib.pyplot as plt

x = range(10)
y = range(10)

fig, ax = plt.subplots(nrows=2, ncols=2)

for row in ax:
    for col in row:
        col.plot(x, y)

plt.show()

inserisci qui la descrizione dell'immagine

Tuttavia, qualcosa del genere funzionerà anche, non è così "pulito", anche se stai creando una figura con sottotrame e poi aggiungi sopra di essi:

fig = plt.figure()

plt.subplot(2, 2, 1)
plt.plot(x, y)

plt.subplot(2, 2, 2)
plt.plot(x, y)

plt.subplot(2, 2, 3)
plt.plot(x, y)

plt.subplot(2, 2, 4)
plt.plot(x, y)

plt.show()

inserisci qui la descrizione dell'immagine


4
Invece di plot(x, y)avere la mia trama proveniente da una funzione definita dall'utente, che crea un grafico con networkx. Come usarlo?
Sigur,

È possibile produrre più sottotrame senza un for-loop? Ad esempio una soluzione vettoriale per la stampa di più colonne di dati su grafici separati? Questo è molto semplice con ggplot in R, ma sembra impossibile con Python.
user2739472,

3
puoi ridurre i due per i loop in uno entro axn = ax.flatten()e poi for axes in axn: axes.plot(x,y)
vagare95

@ wander95 GRAZIE questa risposta non funziona per col = 1 o row = 1 senza di te
Gulzar,

48
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2)

ax[0, 0].plot(range(10), 'r') #row=0, col=0
ax[1, 0].plot(range(10), 'b') #row=1, col=0
ax[0, 1].plot(range(10), 'g') #row=0, col=1
ax[1, 1].plot(range(10), 'k') #row=1, col=1
plt.show()

inserisci qui la descrizione dell'immagine


1
Ottengo ciò che axè, ma non ciò che è fig. Quali sono?
Leevo,

3
ax è in realtà un array intorpidito. fig è la matplotlib.figure.Figureclasse attraverso la quale puoi fare molta manipolazione alla figura tracciata. ad esempio, è possibile aggiungere la barra dei colori a una sottotrama specifica, è possibile modificare il colore di sfondo dietro tutte le sottotrame. è possibile modificare il layout di questi sottotrame o aggiungere una nuova piccola ascia ad essi. preferibilmente potresti voler un singolo titolo principale per tutti i sottotrame che possono essere ottenuti con il fig.suptitle(title)metodo. finalmente una volta che sei soddisfatto della trama, puoi salvarla usando il fig.savefigmetodo. @Leevo
Khalil Al Hooti,

21
  • È anche possibile decomprimere gli assi nella chiamata delle sottotrame

  • E impostare se si desidera condividere gli assi xey tra i grafici secondari

Come questo:

import matplotlib.pyplot as plt
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
ax1.plot(range(10), 'r')
ax2.plot(range(10), 'b')
ax3.plot(range(10), 'g')
ax4.plot(range(10), 'k')
plt.show()

inserisci qui la descrizione dell'immagine


14

Potresti essere interessato al fatto che dalla versione 2.1 di matplotlib anche il secondo codice della domanda funzioni bene.

Dal registro delle modifiche :

La classe Figura ora ha il metodo delle sottotrame La classe Figura ora ha un metodo delle sottotrame () che si comporta come pyplot.subplots () ma su una figura esistente.

Esempio:

import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

plt.show()

Ottengo: AttributeError Traceback (ultima chiamata più recente) <ipython-input-168-ed25aa5255fa> in <module> () 2 3 fig = plt.figure () ----> 4 assi = fig.subplots (nrows = 2 , ncols = 2) AttributeError: l'oggetto 'Figura' non ha attributi 'sottotrame'
Ludo Schmidt

1
@LudoSchmidt La risposta dice "come da matplotlib versione 2.1 ..."
ImportanceOfBeingErnest

11

leggi la documentazione: matplotlib.pyplot.subplots

pyplot.subplots()restituisce una tupla fig, axche è spacchettata in due variabili usando la notazione

fig, axes = plt.subplots(nrows=2, ncols=2)

il codice

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

non funziona perché subplots()è una funzione in pyplotnon un membro dell'oggetto Figure.

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.