En Matplotlib, ¿qué significa el argumento en fig.add_subplot (111)?

472

A veces me encuentro con un código como este:

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

Que produce:

Parcela de ejemplo producida por el código incluido

He estado leyendo la documentación como loco, pero no puedo encontrar una explicación para el 111. a veces veo a 212.

¿Qué significa el argumento de fig.add_subplot()?

contento
fuente

Respuestas:

470

Estos son parámetros de cuadrícula de subtrama codificados como un solo entero. Por ejemplo, "111" significa "cuadrícula 1x1, primera subtrama" y "234" significa "cuadrícula 2x3, cuarta subtrama".

Forma alternativa para add_subplot(111)is add_subplot(1, 1, 1).

Constantin
fuente
18
¿Hay alguna documentación detallada sobre esto? ¿Cuál es la diferencia entre una cuadrícula 1x1 y una cuadrícula 2x3 en este contexto?
donatello
19
1x1 cuadrícula = 1 fila, 1 columna. Cuadrícula 2x3 = 2 filas, 3 columnas. El tercer número comienza desde 1 e incrementa la fila primero. Consulte la documentación de subplot () para obtener más información.
Christian Alis
18
Como otros explicaron (hace más de dos años), este es un legado de matlab. Pero por el bien de los futuros lectores, debe saber que existe una mejor alternativa, en la forma del subplots()método.
jarondl
26
La documentación del legado subplot()está aquí y subplots()está aquí .
crayzeewulf
511

Creo que esto se explicaría mejor con la siguiente imagen:

ingrese la descripción de la imagen aquí

Para inicializar lo anterior, uno escribiría:

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()
SaiyanGirl
fuente
19
Creo que la versión con comas es mucho más intuitiva y legible que la versión con números de 3 dígitos
endolith
Esto es genial, muestra cómo "colocar subtramas en una cuadrícula", ya sea una cuadrícula de 2x2 como el ejemplo ilustrado anteriormente o una cuadrícula de gráficos 4x4, etc. Pero alguien puede explicar qué determina el tamaño de los gráficos que se muestran. Los valores predeterminados para (2,2,1) me parecen bastante pequeños. Me gustaría duplicar ese tamaño o más.
yoshiserry
77
Esto es bastante útil. Esta imagen sería un poco más agradable si no fuera cuadrada (2x2), pero por lo demás sería muy útil.
TravisJ
@TravisJ Wow, ¡qué coincidencia! ¡Estaba pensando exactamente lo mismo una hora antes de que escribieras eso! Lo cambiaré pronto :)
SaiyanGirl
77
Muy útil respuesta! Aunque creo que la edición es inexacta. Matplotlib no admite el comportamiento de abarcar subtramas con declaraciones como 1: 2 o [1 3] (al menos no en 1.5.0), y parece ser solo Matlab. (Tenga en cuenta que hay otras opciones en Matplotlib para lograr este comportamiento, por ejemplo, gridspec )
laboratorio
39

La respuesta de Constantin es acertada, pero para más antecedentes este comportamiento se hereda de Matlab.

El comportamiento de Matlab se explica en la sección Configuración de la figura: visualización de varios gráficos por figura de la documentación de Matlab.

subplot (m, n, i) divide la ventana de la figura en una matriz m-by-n de subtramas pequeñas y selecciona la subtrama para la trama actual. Las parcelas se numeran a lo largo de la fila superior de la ventana de la figura, luego la segunda fila, y así sucesivamente.

DaveTM
fuente
2
Esto es matplotlib, no matlab.
dom0
45
Gran parte del comportamiento de matplotlibs se hereda de Matlab. Como la documentación de Matlab era mejor, pensé que podría ayudar a explicar cómo se comporta esta llamada de función específica. Sí, tienes razón, esta (pregunta) se refiere a matplotlib. La documentación de la subtrama matplotlib es menos clara en mi opinión.
DaveTM
77
La documentación de MATLAB se ha movido .
dotancohen
20

Mi solucion es

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

Cuadrícula 2x2 con fusión 1 y 3

yoonghm
fuente
15

ingrese la descripción de la imagen aquí

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)

El primer código crea la primera subtrama en un diseño que tiene 3 filas y 2 columnas.

Los tres gráficos en la primera columna denotan las 3 filas. El segundo diagrama viene justo debajo del primer diagrama en la misma columna y así sucesivamente.

Las últimas dos parcelas tienen argumentos (2, 2)que indican que la segunda columna tiene solo dos filas, los parámetros de posición se mueven de manera inteligente.

Pritz
fuente
10

fig.add_subplot(ROW,COLUMN,POSITION)

  • FILA = número de filas
  • COLUMNA = número de columnas
  • POSICIÓN = posición del gráfico que está trazando

Ejemplos

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

Hay un total de 2 filas, 1 columna, por lo tanto, se pueden trazar 2 subgrafos. Su ubicación es la 1ra. Hay un total de 2 filas, 1 columna, por lo tanto, se pueden trazar 2 subgrafos. Su ubicación es la 2da.

Rameez Ahmad Dar
fuente
2

El método add_subplot () tiene varias firmas de llamada:

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

Llamadas 1 y 2:

Las llamadas 1 y 2 logran lo mismo entre sí (hasta un límite, explicado a continuación). Piense en ellos como la primera especificación del diseño de la cuadrícula con sus primeros 2 números (2x2, 1x8, 3x4, etc.), por ejemplo:

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

Ambos producen una disposición de subtrama de (3 x 4 = 12) subtramas en 3 filas y 4 columnas. El tercer número en cada llamada indica qué objeto de eje devolver, comenzando desde 1 en la parte superior izquierda, aumentando a la derecha .

Este código ilustra las limitaciones del uso de la llamada 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()

subtramas

Puede ver con la llamada 1 en el LHS que puede devolver cualquier objeto de eje, sin embargo con llamada 2 en el RHS solo puede regresar hasta el índice = 9, representando las subparcelas j), k) y l) inaccesibles usando esta llamada.

Es decir, ilustra este punto de la documentación:

pos es un número entero de tres dígitos, donde el primer dígito es el número de filas, el segundo el número de columnas y el tercero el índice de la subtrama. es decir, fig.add_subplot (235) es lo mismo que fig.add_subplot (2, 3, 5). Tenga en cuenta que todos los enteros deben ser menores que 10 para que este formulario funcione .


Llamada 3

En raras circunstancias, add_subplot puede llamarse con un solo argumento, una instancia de ejes de subtrama ya creada en la figura actual pero no en la lista de ejes de la figura.


Llamada 4 (desde 3.1.0):

Si no se pasan argumentos posicionales, el valor predeterminado es (1, 1, 1).

es decir, reproducir la llamada fig.add_subplot(111)en la pregunta.

compuphys
fuente