¿Cómo obtengo múltiples subtramas en matplotlib?

156

Estoy un poco confundido acerca de cómo funciona este código:

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

¿Cómo funciona el higo, los ejes en este caso? ¿Qué hace?

Además, ¿por qué esto no funcionaría para hacer lo mismo?

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)
bugsyb
fuente
1
A partir de matplotlib 2.1, el segundo código funciona .
Fermi paradoja

Respuestas:

210

Hay varias formas de hacerlo. El subplotsmétodo crea la figura junto con las subtramas que luego se almacenan en la axmatriz. Por ejemplo:

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

ingrese la descripción de la imagen aquí

Sin embargo, algo como esto también funcionará, aunque no es tan "limpio" ya que está creando una figura con subtramas y luego agrega encima de ellas:

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

ingrese la descripción de la imagen aquí

Importancia de ser ernest
fuente
44
En lugar de plot(x, y)que mi trama provenga de una función definida por el usuario, que crea un gráfico con networkx. ¿Cómo usarlo?
Sigur
¿Es posible producir múltiples subtramas sin un ciclo for? Por ejemplo, ¿alguna solución vectorizada para trazar múltiples columnas de datos en parcelas separadas? Esto es muy simple con ggplot en R, pero parece imposible con Python.
user2739472
3
puedes reducir los dos bucles for en uno axn = ax.flatten()y luego for axes in axn: axes.plot(x,y)
wander95
@ wander95 GRACIAS esta respuesta no funciona para col = 1 o fila = 1 sin ti
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()

ingrese la descripción de la imagen aquí

Khalil Al Hooti
fuente
1
Entiendo lo que axes, pero no lo que es fig. ¿Qué son?
Leevo
3
ax es en realidad una matriz numpy. fig es una matplotlib.figure.Figureclase a través de la cual puedes manipular mucho la figura trazada. por ejemplo, puede agregar una barra de colores a una subtrama específica, puede cambiar el color de fondo detrás de todas las subtramas. puede modificar el diseño de estas subtramas o agregarles un nuevo hacha pequeña. preferiblemente puede querer un solo título principal para todas las subtramas que se pueden obtener a través del fig.suptitle(title)método. Finalmente, una vez que esté satisfecho con la trama, puede guardarla utilizando el fig.savefigmétodo. @Leevo
Khalil Al Hooti
21
  • También puede desempaquetar los ejes en la llamada de subtramas

  • Y establezca si desea compartir los ejes X e Y entre las subtramas

Me gusta esto:

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

ingrese la descripción de la imagen aquí

Colin Anthony
fuente
14

Es posible que le interese el hecho de que a partir de la versión 2.1 de matplotlib, el segundo código de la pregunta también funciona bien.

Desde el registro de cambios :

La clase Figura ahora tiene un método de subtramas La clase Figura ahora tiene un método subplots () que se comporta igual que pyplot.subplots () pero en una figura existente.

Ejemplo:

import matplotlib.pyplot as plt

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

plt.show()
Importancia de ser ernest
fuente
Obtengo: AttributeError Traceback (última llamada más reciente) <ipython-input-168-ed25aa5255fa> en <module> () 2 3 fig = plt.figure () ----> 4 ejes = fig.subplots (nrows = 2 , ncols = 2) AttributeError: el objeto 'Figura' no tiene atributo 'subtramas'
Ludo Schmidt
1
@LudoSchmidt La respuesta dice "a partir de matplotlib versión 2.1 ..."
ImportanceOfBeingErnest
11

lea la documentación: matplotlib.pyplot.subplots

pyplot.subplots()devuelve una tupla fig, axque se desempaqueta en dos variables usando la notación

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

el código

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

no funciona porque subplots()es una función que pyplotno es miembro del objeto Figure.

Diziet Asahi
fuente