¿Cuáles son las diferencias entre add_axes y add_subplot?

En una respuesta anterior, se me recomendó usar add_subplot lugar de add_axes para mostrar los ejes correctamente, pero buscando la documentación no pude entender cuándo y por qué debería usar una de estas funciones.

¿Alguien puede explicar las diferencias?

Motivos comunes

Tanto add_axes como add_subplot agregan un eje a una figura. Ambos devuelven un objeto matplotlib.axes.Axes .

Sin embargo, el mecanismo que se utiliza para agregar los ejes difiere sustancialmente.

add_axes

La firma que llama a add_axes es add_axes(rect) , donde rect es una lista [x0, y0, width, height] denota el punto inferior izquierdo de los nuevos ejes en la figura coodinates (x0,y0) y su anchura y altura. Así, los ejes se posicionan en coordenadas absolutas en el canvas. P.ej

 fig = plt.figure() ax = fig.add_axes([0,0,1,1]) 

coloca una figura en el canvas que es exactamente tan grande como el canvas mismo.

add_subplot

La firma de add_subplot de add_subplot no proporciona directamente la opción de colocar los ejes en una posición predefinida. Más bien, permite especificar dónde deben situarse los ejes de acuerdo con una cuadrícula de subttwig. La forma habitual y más fácil de especificar esta posición es la notación de 3 enteros,

 fig = plt.figure() ax = fig.add_subplot(231) 

En este ejemplo, se crean nuevos ejes en la primera posición ( 1 ) en una cuadrícula de 2 filas y 3 columnas. Para producir solo un solo eje, se add_subplot(111) (Primera gráfica en una cuadrícula de 1 por 1).

La ventaja de este método es que matplotlib se encarga del posicionamiento exacto. Por defecto, add_subplot(111) produciría un eje posicionado en [0.125,0.11,0.775,0.77] o similar, que ya deja suficiente espacio alrededor de los ejes para el título y las tags (marca). Sin embargo, esta posición también puede cambiar dependiendo de otros elementos en el gráfico, conjunto de títulos, etc. También se puede ajustar utilizando pyplot.subplots_adjust(...) o pyplot.tight_layout() .

En la mayoría de los casos, add_subplot sería el método preferido para crear ejes para gráficos en un canvas. Solo en los casos en que importa el posicionamiento exacto, add_axes puede ser útil.

Ejemplo

 import matplotlib.pyplot as plt plt.rcParams["figure.figsize"] = (5,3) fig = plt.figure() fig.add_subplot(241) fig.add_subplot(242) ax = fig.add_subplot(223) ax.set_title("subplots") fig.add_axes([0.77,.3,.2,.6]) ax2 =fig.add_axes([0.67,.5,.2,.3]) fig.add_axes([0.6,.1,.35,.3]) ax2.set_title("random axes") plt.tight_layout() plt.show() 

introduzca la descripción de la imagen aquí

Alternativa

La forma más fácil de obtener una o más subplots junto con sus identificadores es plt.subplots() . Para uno de los ejes, use

 fig, ax = plt.subplots() 

o, si se necesitan más subttwigs,

 fig, axes = plt.subplots(nrows=3, ncols=4) 

La pregunta inicial

En la pregunta inicial, se colocó un eje utilizando fig.add_axes([0,0,1,1]) , de manera que se asiente a los límites de la figura. La desventaja de esto es, por supuesto, que se eliminan los ticks, ticklabels, las tags de los ejes y los títulos. Por lo tanto, en uno de los comentarios a la respuesta, fig.add_subplot usar fig.add_subplot ya que esto permitirá automáticamente suficiente espacio para esos elementos y, si esto no es suficiente, se puede ajustar utilizando pyplot.subplots_adjust(...) o pyplot.tight_layout() .