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