Nota
Haga clic aquí para descargar el código de ejemplo completo
Guía de diseño ajustado #
Cómo usar un diseño ajustado para que las tramas se ajusten a tu figura de forma limpia.
tight_layout ajusta automáticamente los parámetros de la subparcela para que la(s) subparcela(s) encaje(n) en el área de la figura. Esta es una función experimental y es posible que no funcione en algunos casos. Solo verifica la extensión de las etiquetas de marca, las etiquetas de los ejes y los títulos.
Una alternativa a tight_layout es constrained_layout .
Ejemplo sencillo #
En matplotlib, la ubicación de los ejes (incluidas las subparcelas) se especifica en coordenadas de figuras normalizadas. Puede suceder que las etiquetas de los ejes o los títulos (o, a veces, incluso las etiquetas de tick) salgan del área de la figura y, por lo tanto, se recorten.
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['savefig.facecolor'] = "0.8"
def example_plot(ax, fontsize=12):
ax.plot([1, 2])
ax.locator_params(nbins=3)
ax.set_xlabel('x-label', fontsize=fontsize)
ax.set_ylabel('y-label', fontsize=fontsize)
ax.set_title('Title', fontsize=fontsize)
plt.close('all')
fig, ax = plt.subplots()
example_plot(ax, fontsize=24)
![Título](/stable/_images/sphx_glr_tight_layout_guide_001.png)
Para evitar esto, es necesario ajustar la ubicación de los ejes. Para las subparcelas, esto se puede hacer manualmente ajustando los parámetros de la subparcela usando Figure.subplots_adjust
. Figure.tight_layout
hace esto automáticamente.
fig, ax = plt.subplots()
example_plot(ax, fontsize=24)
plt.tight_layout()
![Título](/stable/_images/sphx_glr_tight_layout_guide_002.png)
Tenga en cuenta que matplotlib.pyplot.tight_layout()
solo ajustará los parámetros de subtrama cuando se llame. Para realizar este ajuste cada vez que se vuelve a dibujar la figura, puede llamar a fig.set_tight_layout(True)
, o, de manera equivalente, establecer rcParams["figure.autolayout"]
(predeterminado: False
) a True
.
Cuando tiene varias subparcelas, a menudo ve etiquetas de diferentes ejes que se superponen entre sí.
plt.close('all')
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)
example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
example_plot(ax4)
![Título, Título, Título, Título](/stable/_images/sphx_glr_tight_layout_guide_003.png)
tight_layout()
también ajustará el espacio entre las subparcelas para minimizar las superposiciones.
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)
example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
example_plot(ax4)
plt.tight_layout()
![Título, Título, Título, Título](/stable/_images/sphx_glr_tight_layout_guide_004.png)
tight_layout()
puede tomar argumentos de palabras clave de
pad , w_pad y h_pad . Éstos controlan el relleno adicional alrededor del borde de la figura y entre las subparcelas. Los pads se especifican en fracción del tamaño de fuente.
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)
example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
example_plot(ax4)
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)
![Título, Título, Título, Título](/stable/_images/sphx_glr_tight_layout_guide_005.png)
tight_layout()
funcionará incluso si los tamaños de las subparcelas son diferentes en la medida en que su especificación de cuadrícula sea compatible. En el siguiente ejemplo, ax1 y ax2 son subparcelas de una cuadrícula de 2x2, mientras que ax3 es de una cuadrícula de 1x2.
plt.close('all')
fig = plt.figure()
ax1 = plt.subplot(221)
ax2 = plt.subplot(223)
ax3 = plt.subplot(122)
example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
plt.tight_layout()
![Título, Título, Título](/stable/_images/sphx_glr_tight_layout_guide_006.png)
Funciona con subparcelas creadas con
subplot2grid()
. En general, las subparcelas creadas a partir de gridspec ( Organización de múltiples ejes en una figura ) funcionarán.
plt.close('all')
fig = plt.figure()
ax1 = plt.subplot2grid((3, 3), (0, 0))
ax2 = plt.subplot2grid((3, 3), (0, 1), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 0), colspan=2, rowspan=2)
ax4 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
example_plot(ax4)
plt.tight_layout()
![Título, Título, Título, Título](/stable/_images/sphx_glr_tight_layout_guide_007.png)
Aunque no se probó a fondo, parece funcionar para tramas secundarias con aspecto != "auto" (p. ej., ejes con imágenes).
arr = np.arange(100).reshape((10, 10))
plt.close('all')
fig = plt.figure(figsize=(5, 4))
ax = plt.subplot()
im = ax.imshow(arr, interpolation="none")
plt.tight_layout()
![guía de diseño ajustado](/stable/_images/sphx_glr_tight_layout_guide_008.png)
Advertencias #
tight_layout
considera a todos los artistas en los ejes por defecto. Para eliminar un artista del cálculo del diseño, puede llamar aArtist.set_in_layout
.tight_layout
asume que el espacio adicional necesario para los artistas es independiente de la ubicación original de los ejes. Esto suele ser cierto, pero hay casos raros en los que no lo es.pad=0
puede recortar algunos textos por unos pocos píxeles. Esto puede ser un error o una limitación del algoritmo actual y no está claro por qué sucede. Mientras tanto, se recomienda el uso de una almohadilla de más de 0,3.
Usar con GridSpec #
GridSpec tiene su propio GridSpec.tight_layout
método (la API de pyplot
pyplot.tight_layout
también funciona).
import matplotlib.gridspec as gridspec
plt.close('all')
fig = plt.figure()
gs1 = gridspec.GridSpec(2, 1)
ax1 = fig.add_subplot(gs1[0])
ax2 = fig.add_subplot(gs1[1])
example_plot(ax1)
example_plot(ax2)
gs1.tight_layout(fig)
![Título, Título](/stable/_images/sphx_glr_tight_layout_guide_009.png)
Puede proporcionar un parámetro rect opcional , que especifica el cuadro delimitador en el que se ajustarán las subparcelas. Las coordenadas deben estar en coordenadas de figuras normalizadas y el valor predeterminado es (0, 0, 1, 1).
fig = plt.figure()
gs1 = gridspec.GridSpec(2, 1)
ax1 = fig.add_subplot(gs1[0])
ax2 = fig.add_subplot(gs1[1])
example_plot(ax1)
example_plot(ax2)
gs1.tight_layout(fig, rect=[0, 0, 0.5, 1.0])
![Título, Título](/stable/_images/sphx_glr_tight_layout_guide_010.png)
Sin embargo, no recomendamos que se use para construir manualmente diseños más complicados, como tener un GridSpec en el lado izquierdo y otro en el lado derecho de la figura. Para estos casos de uso, uno debe aprovechar las Nested Gridspecs o las subfiguras de Figura .
Leyendas y Anotaciones #
Antes de Matplotlib 2.2, las leyendas y las anotaciones se excluyeron de los cálculos del cuadro delimitador que deciden el diseño. Posteriormente, estos artistas se agregaron al cálculo, pero a veces no es deseable incluirlos. Por ejemplo, en este caso, sería bueno que los ejes se encogieran un poco para dejar espacio para la leyenda:
fig, ax = plt.subplots(figsize=(4, 3))
lines = ax.plot(range(10), label='A simple plot')
ax.legend(bbox_to_anchor=(0.7, 0.5), loc='center left',)
fig.tight_layout()
plt.show()
![guía de diseño ajustado](/stable/_images/sphx_glr_tight_layout_guide_011.png)
Sin embargo, a veces esto no se desea (muy a menudo cuando se usa
). Para eliminar la leyenda del cálculo del cuadro delimitador, simplemente establecemos su límite y la leyenda se ignorará.fig.savefig('outname.png', bbox_inches='tight')
leg.set_in_layout(False)
fig, ax = plt.subplots(figsize=(4, 3))
lines = ax.plot(range(10), label='B simple plot')
leg = ax.legend(bbox_to_anchor=(0.7, 0.5), loc='center left',)
leg.set_in_layout(False)
fig.tight_layout()
plt.show()
![guía de diseño ajustado](/stable/_images/sphx_glr_tight_layout_guide_012.png)
Usar con AxesGrid1 #
Si bien es limitado, mpl_toolkits.axes_grid1
también es compatible.
from mpl_toolkits.axes_grid1 import Grid
plt.close('all')
fig = plt.figure()
grid = Grid(fig, rect=111, nrows_ncols=(2, 2),
axes_pad=0.25, label_mode='L',
)
for ax in grid:
example_plot(ax)
ax.title.set_visible(False)
plt.tight_layout()
![Título, Título, Título, Título](/stable/_images/sphx_glr_tight_layout_guide_013.png)
Barra de colores #
Si crea una barra de colores con Figure.colorbar
, la barra de colores creada se dibuja en una subparcela siempre que los ejes principales también sean una subparcela, por lo
Figure.tight_layout
que funcionará.
plt.close('all')
arr = np.arange(100).reshape((10, 10))
fig = plt.figure(figsize=(4, 4))
im = plt.imshow(arr, interpolation="none")
plt.colorbar(im)
plt.tight_layout()
![guía de diseño ajustado](/stable/_images/sphx_glr_tight_layout_guide_014.png)
Otra opción es usar el kit de herramientas AxesGrid1 para crear explícitamente un eje para la barra de colores.
from mpl_toolkits.axes_grid1 import make_axes_locatable
plt.close('all')
arr = np.arange(100).reshape((10, 10))
fig = plt.figure(figsize=(4, 4))
im = plt.imshow(arr, interpolation="none")
divider = make_axes_locatable(plt.gca())
cax = divider.append_axes("right", "5%", pad="3%")
plt.colorbar(im, cax=cax)
plt.tight_layout()
![guía de diseño ajustado](/stable/_images/sphx_glr_tight_layout_guide_015.png)
Tiempo total de ejecución del script: (0 minutos 5.470 segundos)