¿Por qué muchos ejemplos usan `fig, ax = plt.subplots()`?

Resuelto neelshiv asked hace 9 años • 6 respuestas

Estoy aprendiendo a usar matplotlibestudiando 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...

  • Modificar el texto de la etiqueta de marca
  • http://matplotlib.org/examples/pylab_examples/boxplot_demo2.html

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

# Just a figure and one subplot
f, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')
neelshiv avatar Dec 09 '15 00:12 neelshiv
Aceptado

plt.subplots()es una función que devuelve una tupla que contiene una figura y objetos de ejes. Por lo tanto, cuando lo uses fig, ax = plt.subplots(), descomprimes esta tupla en las variables figy ax. Tener figes útil si desea cambiar los atributos a nivel de figura o guardar la figura como un archivo de imagen más adelante (por ejemplo, con fig.savefig('yourfilename.png')). Ciertamente no es necesario 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 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 avatar Dec 08 '2015 17:12 jonchar

Sólo un suplemento aquí.

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

Como se menciona en el documento, podemos usarlo fig = plt.subplots(nrows=2, ncols=2)para establecer un grupo de subtramas con grid(2,2) en un objeto de figura.

Entonces, como sabemos, fig, ax = plt.subplots()devuelve una tupla, intentémoslo fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2)primero.

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

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

Así que intentemos esto de nuevo:

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

y comprueba 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 debería ser:

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

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

Espero que esto te sea útil.

Duskash avatar Jul 21 '2017 04:07 Duskash

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

Se puede usar plt.subplots()para hacer todas sus subtramas a la vez y devuelve la figura y los ejes (plural de 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 usarlo plt.subplot()si desea agregar las subtramas por separado. Devuelve solo 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 para personalizar directamente toda su figura.

# 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, lo que puede resultar engorroso.

Light_B avatar Dec 21 '2018 16:12 Light_B

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

John T avatar Mar 31 '2019 05:03 John T

El uso plt.subplots()es popular porque le brinda un objeto Axes y le permite usar la interfaz Axes para definir gráficos.

La alternativa sería utilizar la interfaz de estado global, la plt.plotfuncionalidad etc.:

import matplotlib.pyplot as plt

# global state version - modifies "current" figure
plt.plot(...)
plt.xlabel(...)

# axes version - modifies explicit axes
ax.plot(...)
ax.set_xlabel(...)

Entonces, ¿ por qué preferimos Axes?

  • Es refactorable: puede guardar parte del código en una función que toma un objeto Axes y no depende del estado global.
  • Es más fácil hacer la transición a una situación con múltiples subtramas.
  • Una interfaz consistente/familiar en lugar de cambiar entre dos
  • La única forma de acceder a la profundidad de todas las funciones de matplotlib

La versión de estado global se creó de esa manera para que fuera fácil de usar de forma interactiva y para ser una interfaz familiar para los usuarios de Matlab, pero en programas y scripts más grandes los puntos descritos aquí favorecen el uso de la interfaz de Axes.

Hay una publicación de blog matplotlib que explora este tema con más profundidad: Pyplot vs interfaz orientada a objetos

Es relativamente fácil lidiar con ambos mundos. Por ejemplo, siempre podemos preguntar por los ejes actuales: ax = plt.gca()("obtener ejes actuales").

creanion avatar Oct 24 '2021 10:10 creanion