In Matplotlib, cosa significa l'argomento in fig.add_subplot (111)?


472

A volte mi imbatto in codice come questo:

import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
fig = plt.figure()
fig.add_subplot(111)
plt.scatter(x, y)
plt.show()

Che produce:

Esempio di grafico prodotto dal codice incluso

Ho letto la documentazione come un matto ma non riesco a trovare una spiegazione per 111. a volte vedo a 212.

Cosa significa l'argomento di fig.add_subplot()?

Risposte:


470

Questi sono i parametri della griglia della sottotrama codificati come un unico numero intero. Ad esempio, "111" significa "griglia 1x1, prima sottotrama" e "234" significa "griglia 2x3, quarta sottotrama".

Modulo alternativo per add_subplot(111)è add_subplot(1, 1, 1).


18
Esiste una documentazione dettagliata al riguardo? Qual è la differenza tra una griglia 1x1 e una griglia 2x3 in questo contesto?
donatello,

19
Griglia 1x1 = 1 riga, 1 colonna. Griglia 2x3 = 2 file, 3 colonne. Il terzo numero inizia da 1 e aumenta prima di riga. Vedere la documentazione di subplot () per ulteriori informazioni.
Christian Alis,

18
Come altri hanno spiegato (più di due anni fa), questo è un lascito di Matlab. Ma per il bene dei futuri lettori, dovresti sapere che esiste un'alternativa migliore, sotto forma di subplots()metodo.
Jarondl,

26
La documentazione dell'eredità subplot()è qui ed subplots()è qui .
crayzeewulf,

511

Penso che questo sarebbe meglio spiegato dalla seguente immagine:

inserisci qui la descrizione dell'immagine

Per inizializzare quanto sopra, si dovrebbe digitare:

import matplotlib.pyplot as plt
fig = plt.figure()
fig.add_subplot(221)   #top left
fig.add_subplot(222)   #top right
fig.add_subplot(223)   #bottom left
fig.add_subplot(224)   #bottom right 
plt.show()

19
Penso che la versione con virgole sia molto più intuitiva e leggibile rispetto alla versione con numeri a 3 cifre
endolith

Questo è fantastico, mostra come "posizionare le sottotrame in una griglia" sia che una griglia 2x2 come l'esempio sopra illustrato o una griglia di grafici 4x4 ecc. Ma qualcuno può spiegare cosa determina la dimensione di quei grafici che vengono visualizzati. I valori predefiniti per (2,2,1) trovo piuttosto piccoli, mi piacerebbe forse raddoppiare quella dimensione o più.
yoshiserry,

7
Questo è abbastanza utile. Questa immagine sarebbe un po 'più bella se non fosse quadrata (2x2) ma per il resto molto utile.
TravisJ

@TravisJ Caspita, che coincidenza! Stavo pensando esattamente la stessa cosa circa un'ora prima che tu lo scrivessi! Lo cambierò presto :)
SaiyanGirl

7
Risposta molto utile! Anche se penso che la modifica sia imprecisa. Il comportamento di estendere le sottotrame con istruzioni come 1: 2 o [1 3] non è supportato da Matplotlib (almeno non in 1.5.0) e sembra essere solo Matlab. (Nota che ci sono altre opzioni in Matplotlib per raggiungere questo comportamento, ad esempio gridspec )
lab

39

La risposta di Constantin è precisa, ma per ulteriori informazioni questo comportamento è ereditato da Matlab.

Il comportamento di Matlab è spiegato nella sezione Figura Setup - Visualizzazione di grafici multipli per figura della documentazione di Matlab.

sottotrama (m, n, i) suddivide la finestra della figura in una matrice m-by-n di piccoli sottotrame e seleziona il sottotrama per il diagramma corrente. I grafici sono numerati lungo la riga superiore della finestra della figura, quindi la seconda riga e così via.


2
Questo è matplotlib, non matlab.
dom0

45
Gran parte del comportamento di matplotlibs è ereditato da Matlab. Poiché la documentazione di Matlab era migliore, ho pensato che potesse aiutare a spiegare come si comporta questa specifica chiamata di funzione. Sì, hai ragione, questa (domanda) riguarda matplotlib. La documentazione della sottotrama matplotlib è meno chiara secondo me.
DaveTM,

7
La documentazione MATLAB è stata spostata .
dotancohen,

20

La mia soluzione è

fig = plt.figure()
fig.add_subplot(1, 2, 1)   #top and bottom left
fig.add_subplot(2, 2, 2)   #top right
fig.add_subplot(2, 2, 4)   #bottom right 
plt.show()

Griglia 2x2 con unione 1 e 3


15

inserisci qui la descrizione dell'immagine

import matplotlib.pyplot as plt
plt.figure(figsize=(8,8))
plt.subplot(3,2,1)
plt.subplot(3,2,3)
plt.subplot(3,2,5)
plt.subplot(2,2,2)
plt.subplot(2,2,4)

Il primo codice crea la prima sottotrama in un layout che ha 3 righe e 2 colonne.

I tre grafici nella prima colonna indicano le 3 righe. La seconda trama arriva appena sotto la prima trama nella stessa colonna e così via.

Gli ultimi due grafici hanno argomenti (2, 2)che indicano che la seconda colonna ha solo due righe, i parametri di posizione spostano la riga in modo saggio.


10

fig.add_subplot(ROW,COLUMN,POSITION)

  • ROW = numero di righe
  • COLONNA = numero di colonne
  • POSITION = posizione del grafico che si sta disegnando

Esempi

`fig.add_subplot(111)` #There is only one subplot or graph  
`fig.add_subplot(211)`  *and*  `fig.add_subplot(212)` 

Ci sono 2 file in totale, 1 colonna, pertanto è possibile tracciare 2 grafici secondari. La sua posizione è 1 °. Ci sono 2 file in totale, 1 colonna pertanto è possibile tracciare 2 grafici secondari. La sua posizione è 2a


2

Il metodo add_subplot () ha diverse firme di chiamata:

  1. add_subplot(nrows, ncols, index, **kwargs)
  2. add_subplot(pos, **kwargs)
  3. add_subplot(ax)
  4. add_subplot() <- dalla 3.1.0

Chiamate 1 e 2:

Le chiamate 1 e 2 ottengono le stesse cose l'una dell'altra (fino a un limite, spiegato di seguito). Pensa a loro come prima specificando il layout della griglia con i loro primi 2 numeri (2x2, 1x8, 3x4, ecc.), Ad esempio:

f.add_subplot(3,4,1) 
# is equivalent to:
f.add_subplot(341)

Entrambi producono una disposizione di sottotrame di (3 x 4 = 12) trame secondarie in 3 file e 4 colonne. Il terzo numero in ciascuna chiamata indica quale oggetto asse restituire, a partire da 1 in alto a sinistra, aumentando a destra .

Questo codice illustra i limiti dell'utilizzo della chiamata 2:

#!/usr/bin/env python3
import matplotlib.pyplot as plt

def plot_and_text(axis, text):
  '''Simple function to add a straight line
  and text to an axis object'''
  axis.plot([0,1],[0,1])
  axis.text(0.02, 0.9, text)

f = plt.figure()
f2 = plt.figure()

_max = 12
for i in range(_max):
  axis = f.add_subplot(3,4,i+1, fc=(0,0,0,i/(_max*2)), xticks=[], yticks=[])
  plot_and_text(axis,chr(i+97) + ') ' + '3,4,' +str(i+1))

  # If this check isn't in place, a 
  # ValueError: num must be 1 <= num <= 15, not 0 is raised
  if i < 9:
    axis = f2.add_subplot(341+i, fc=(0,0,0,i/(_max*2)), xticks=[], yticks=[])
    plot_and_text(axis,chr(i+97) + ') ' + str(341+i))

f.tight_layout()
f2.tight_layout()
plt.show()

sottotrame

Puoi vedere con chiamata 1 sull'LHS che puoi restituire qualsiasi oggetto asse, tuttavia con la chiamata 2 sull'RHS puoi solo restituire fino all'indice = 9 rendering delle sottotrame j), k) el) inaccessibili usando questa chiamata.

Cioè illustra questo punto dalla documentazione:

pos è un numero intero a tre cifre, in cui la prima cifra è il numero di righe, la seconda il numero di colonne e la terza l'indice della sottotrama. cioè fig.add_subplot (235) è uguale a fig.add_subplot (2, 3, 5). Si noti che tutti i numeri interi devono essere inferiori a 10 affinché questo modulo funzioni .


Chiama 3

In rare circostanze, add_subplot può essere chiamato con un singolo argomento, un'istanza di assi della sottotrama già creata nella figura attuale ma non nell'elenco di assi della figura.


Chiama 4 (dalla 3.1.0):

Se non vengono passati argomenti posizionali, il valore predefinito è (1, 1, 1).

cioè, riproducendo la chiamata fig.add_subplot(111)nella domanda.

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.