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

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


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

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.


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


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.


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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.