¿Por qué muchos ejemplos usan `fig, ax = plt.subplots ()` en Matplotlib / pyplot / python

267

Estoy aprendiendo a usar matplotlibal estudiar ejemplos, y muchos ejemplos parecen incluir una línea como la siguiente antes de crear una sola trama ...

fig, ax = plt.subplots()

Aquí hay unos ejemplos...

Veo que esta función se usa mucho, a pesar de que el ejemplo solo intenta crear un solo gráfico. ¿Hay alguna otra ventaja? La demostración oficial de subplots()también se usa f, ax = subplotsal crear un solo gráfico, y solo hace referencia a axe después de eso. Este es el código que usan.

# Just a figure and one subplot
f, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')
neelshiv
fuente
11
bueno, es breve, conciso y obtienes una referencia de dos figuras y ejes en un solo paso. Es pitónico, porque es hermoso :)
cel

Respuestas:

325

plt.subplots()es una función que devuelve una tupla que contiene una figura y eje (s) objeto (s). Por lo tanto, al usar fig, ax = plt.subplots(), descomprime esta tupla en las variables figy ax. Tener figes útil si desea cambiar los atributos de nivel de figura o guardar la figura como un archivo de imagen más tarde (por ejemplo, con fig.savefig('yourfilename.png')). Ciertamente no tiene que usar el objeto de figura devuelto, pero muchas personas lo usan más tarde, por lo que es común verlo. Además, todos los objetos de los ejes (los objetos que tienen métodos de trazado) tienen un objeto de figura principal de todos modos, por lo tanto:

fig, ax = plt.subplots()

es más conciso que esto:

fig = plt.figure()
ax = fig.add_subplot(111)
jonchar
fuente
8
Muy buena explicación. Aquí está el documento: matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplots
bretcj7
2
¿Por qué siempre usamos 111 como parámetro en la subtrama?
Priyansh
@Priyansh porque se hereda de la sintaxis de Matlab
pcko1
@Priyansh No siempre. Si quieres 4 gráficos, podrías tenerlos ax11, ax12, ax21, ax22usando fig.add_subplot(221)(o 222, 223, 224 respectivamente).
Guimoute
49

Solo un suplemento aquí.

La siguiente pregunta es: ¿qué sucede si quiero más subtramas en la figura?

Como se menciona en el Doc, podemos usar fig = plt.subplots(nrows=2, ncols=2) para establecer un grupo de subtramas con cuadrícula (2,2) en un objeto de figura.

Entonces, como sabemos, el fig, ax = plt.subplots()resultado es una tupla, intentemos fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2)primero.

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

Provoca un error, pero no te preocupes, porque ahora vemos que plt.subplots() realidad devuelve una tupla con dos elementos. El primero debe ser un objeto de figura y el otro debe ser un grupo de objetos de subtramas.

Entonces intentemos esto de nuevo:

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

y verifique el tipo:

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

Por supuesto, si usa parámetros como (nrows = 1, ncols = 4), entonces el formato debe ser:

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

Así que solo recuerde mantener la construcción de la lista igual que la cuadrícula de subtramas que establecemos en la figura.

Espero que esto sea útil para ti.

Duskash
fuente
2
no olvide agregar plt.tight_layout () si sus subtramas tienen títulos
gota
12
¿Qué pasa si tienes muchas subtramas? Es más fácil hacerlo de esta manera: fig, axes = plt.subplots(nrows=10, ncols=3)y axes = axes.flatten(). Ahora se puede hacer referencia a cada subtrama por su índice: axes[0], axes[1], ...
Guillaume
¿Qué sucede si quiero que una de esas subtramas abarque varias columnas o filas? ¿Es factible con el comando subplots?
gota
1
@BallpointBen No estoy seguro de que funcione si nrows=1, como entonces, axesse devuelve plano con una longitud igual ancols
Ben
1
@BallpointBen Me acabo de dar cuenta de que puedes solucionar esto haciendo:fig, axes = plt.subplots(nrows=1, ncols=3, squeeze=False)
Ben,
15

Como complemento de la pregunta y las respuestas anteriores, también hay una diferencia importante entre plt.subplots()y plt.subplot(), observe la falta 's'al final.

Uno puede usar plt.subplots()para hacer todas sus subtramas a la vez y devuelve la figura y los ejes (plural del eje) de las subtramas como una tupla. Una figura puede entenderse como un lienzo donde pintas tu boceto.

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

Mientras que, puede usar plt.subplot()si desea agregar las subtramas por separado. Solo devuelve el eje de una subtrama.

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)

Sin embargo, plt.subplots()se prefiere porque le brinda opciones más fáciles de personalizar directamente su figura completa

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

Ejes compartidos mientras que, con plt.subplot(), habrá que especificar individualmente para cada eje que puede volverse engorroso.

Light_B
fuente
1
su línea de código ax3 = plt.subplot(2,1,3) no funcionará porque es 2 por 1, que tiene solo 2 gráficos.
Cloud Cho
1
Gracias, lo arreglé. Hubo otro cambio necesario en el último bloque de código.
Light_B
3

Además de las respuestas anteriores, puede verificar el tipo de objeto type(plt.subplots())que usa que devuelve una tupla, por otro lado, type(plt.subplot())devuelve el matplotlib.axes._subplots.AxesSubplotque no puede desempaquetar.

John T
fuente
44
¡Bienvenido a Stack Overflow! Esto es realmente un comentario, no una respuesta. Con un poco más de representación, podrás publicar comentarios . ¡Gracias!
Miroslav Glamuzina