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

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_layouthace esto automáticamente.

fig, ax = plt.subplots()
example_plot(ax, fontsize=24)
plt.tight_layout()
Título

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

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

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

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

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

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

Advertencias #

  • tight_layoutconsidera a todos los artistas en los ejes por defecto. Para eliminar un artista del cálculo del diseño, puede llamar a Artist.set_in_layout.

  • tight_layoutasume 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=0puede 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_layoutmétodo (la API de pyplot pyplot.tight_layouttambié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

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

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

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

Usar con AxesGrid1 #

Si bien es limitado, mpl_toolkits.axes_grid1tambié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

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_layoutque 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

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

Tiempo total de ejecución del script: (0 minutos 5.470 segundos)

Galería generada por Sphinx-Gallery