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

Estoy aprendiendo a usar matplotlib estudiando ejemplos, y muchos ejemplos parecen incluir una línea como la siguiente antes de crear un solo gráfico …

 fig, ax = plt.subplots() 

Aquí hay unos ejemplos…

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

Veo que esta función se usa mucho, aunque el ejemplo solo intenta crear un único gráfico. ¿Hay alguna otra ventaja? La demo oficial para subplots() también usa f, ax = subplots cuando crea un solo gráfico, y solo hace referencia a ax 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') 

    plt.subplots() es una función que devuelve una tupla que contiene una figura y objeto (s) de ejes. Por lo tanto, al usar fig, ax = plt.subplots() descomprime esta tupla en las variables fig y ax . Tener fig es útil si desea cambiar los atributos de nivel de figura o guardar la figura como un archivo de imagen más adelante (por ejemplo, con fig.savefig('yourfilename.png') . Ciertamente no tiene que usar el objeto de figura devuelto, pero sí muchos la gente lo usa más tarde, así 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) 

    Sólo un suplemento aquí.

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

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

    Entonces, como sabemos, fig, ax = plt.subplots() devuelve una tupla, fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2) primer lugar.

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

    Produce un error, pero no se preocupe, 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 subplots.

    Así que intentemos esto de nuevo:

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

    y compruebe el tipo:

     type(fig) # type(ax1) # 

    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) 

    Tan solo recuerde mantener la construcción de la lista como la cuadrícula de subplots que configuramos en la figura.

    Espero que esto sea de ayuda para usted.

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

    Uno puede usar plt.subplots() para hacer todos sus subplots a la vez y devuelve la figura y los ejes (plural de ejes) de los subplots como una tupla. Una figura puede entenderse como un canvas donde pintas tu boceto.

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

    Mientras tanto, puede usar plt.subplot() si desea agregar las subplots por separado. Devuelve solo el eje de una subplot.

     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) ax3 = plt.subplot(2,1,3) 

    Sin embargo, se prefiere plt.subplots() 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,1, sharex=True, sharey=True) 

    Ejes compartidos mientras que con plt.subplot() , uno tendrá que especificar individualmente para cada eje lo que puede volverse incómodo.

    Además de las respuestas anteriores, puede verificar el tipo de objeto usando type(plt.subplots()) que devuelve una tupla, por otra parte, type(plt.subplot()) devuelve matplotlib.axes._subplots.AxesSubplot which no se puede desempacar.