Skip to content

Solucionar que Matplotlib savefig Corte Etiquetas: Guía Completa 2025

Updated on

Una guía completa y actualizada para solucionar que Matplotlib savefig corte etiquetas, incluyendo tight_layout, constrained_layout, bbox_inches, rcParams y buenas prácticas modernas.

Si alguna vez has creado una gráfica con Matplotlib que se ve perfecta en el notebook, pero al exportarla con savefig() aparece cortada, recortada o con etiquetas desaparecidas, no eres la única persona.

Este es uno de los problemas más frecuentes de Matplotlib, especialmente cuando usas:

  • Etiquetas altas renderizadas con LaTeX
  • Títulos de varias líneas
  • Etiquetas de ejes giradas o muy largas
  • Subplots con espaciado muy ajustado

En esta guía actualizada aprenderás todas las formas fiables de asegurar que tus figuras guardadas siempre incluyan etiquetas, títulos y anotaciones, con buenas prácticas modernas en las que puedes confiar.


🧠 Por Qué Ocurre Esto

Matplotlib no amplía automáticamente el lienzo de la figura cuando las etiquetas se extienden más allá de los ejes.
Las causas habituales incluyen:

  • Expresiones estilo LaTeX que generan símbolos altos
  • Valores grandes de fontsize
  • Etiquetas de ticks largas o rotadas
  • Cuadrículas de subplots muy ajustadas

Ejemplo:

matplotlib-savefig-label-clipping-example

import matplotlib.pyplot as plt
 
plt.figure()
plt.ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
plt.xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$', fontsize=50)
plt.title('Example with matplotlib 3.4.2\nLabel clipping example')
plt.show()

La etiqueta del eje Y es visible, pero la del eje X a menudo queda cortada en la figura guardada.


✅ 1. Mejor Solución Moderna (Recomendada): Usar constrained_layout=True

Desde Matplotlib 3.6+ (y todavía en 3.8+ en 2025), el método de distribución recomendado es:

fig, ax = plt.subplots(constrained_layout=True)

Ejemplo:

matplotlib-constrained-layout-example.png

fig, ax = plt.subplots(figsize=(7, 5), constrained_layout=True)
ax.set_xlabel("Very long bottom label that usually gets clipped", fontsize=16)
ax.set_ylabel("Tall math label:\n$\\frac{x_a - x_b}{x_c}$")
fig.savefig("figure.png")

✔ Ventajas

  • Moderno y estable
  • Funciona mejor que tight_layout()
  • Funciona bien con colorbars, leyendas y subplots

⚠ Inconvenientes

  • Un poco más lento en cuadrículas grandes de subplots

Si estás escribiendo código nuevo con Matplotlib en 2025, esta debería ser tu opción por defecto.


✅ 2. Ajustar Márgenes Manualmente con subplots_adjust

Sigue siendo un método sencillo y efectivo:

plt.subplots_adjust(bottom=0.15)

O sobre la figura:

plt.gcf().subplots_adjust(bottom=0.18)

Aumenta el valor del margen hasta que las etiquetas dejen de solaparse o cortarse.

matplotlib-subplots-adjust-margins.png


✅ 3. Usar tight_layout() (Más Antiguo pero Aún Útil)

tight_layout() ajusta automáticamente el relleno:

fig, axes = plt.subplots(ncols=2, nrows=2, figsize=(8, 6))
for ax in axes.flatten():
    ax.set_xlabel("Example X label")
    ax.set_ylabel("Example Y label")
 
plt.tight_layout()
plt.show()

Notas

  • Bueno para gráficas sencillas
  • Puede tener problemas con leyendas y colorbars
  • constrained_layout=True es ahora la solución preferida

✅ 4. Guardar con bbox_inches="tight" (Muy Buen Arreglo Rápido)

Una solución muy usada para el recorte:

plt.savefig("myfile.png", bbox_inches="tight")

Cuándo usarlo

  • Arreglo rápido sin modificar el layout
  • Asegura que todo lo que aparece en pantalla también aparezca en el archivo

matplotlib-tight-layout-subplots.png


✅ 5. Activar Distribución Automática con rcParams

Si quieres una solución permanente que se aplique a todas las gráficas: matplotlib-bbox-inches-tight-example.png

Actualizar rcParams en tiempo de ejecución:

from matplotlib import rcParams
rcParams.update({"figure.autolayout": True})

O configurar matplotlibrc:

figure.autolayout : True

Esto ayuda a garantizar resultados consistentes entre distintas máquinas.


📌 Tabla Resumen: ¿Qué Método Debería Usar?

MétodoCuándo UsarloMejor Para
constrained_layout=True**Opción por defecto **Layout moderno, subplots, leyendas
bbox_inches='tight'Arreglo rápido al guardarExportar gráficas individuales
tight_layout()Código legadoCuadrículas simples de subplots
subplots_adjust()Quieres control totalmente manualAjuste fino para publicaciones
figure.autolayout=TrueValor por defecto a nivel proyectoConsistencia entre distintos sistemas

💡 Consejos Extra para Figuras Perfectas

✔ Usar mayor DPI para reducir problemas con etiquetas largas

plt.savefig("fig.png", dpi=200, bbox_inches="tight")

✔ Evitar tamaños de fuente enormes salvo que sean necesarios

Las fuentes muy grandes aumentan la probabilidad de recorte.

✔ Para colorbars: usa constrained_layout

Funciona notablemente mejor que tight_layout.


📊 Crea Visualizaciones sin Ajustar Layout Manualmente (PyGWalker)

Si usas Matplotlib principalmente para visualizar DataFrames, puede que no necesites ajustar layouts manualmente.

Puedes simplemente:

  • Cargar tu DataFrame
  • Arrastrar y soltar campos
  • Generar gráficas al instante

Usando PyGWalker, una herramienta de visualización open-source:

PyGWalker for Data visualization (opens in a new tab)

Así se usa:

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

O pruébalo online:

KaggleGoogle ColabGitHub

❓ Preguntas Frecuentes

  1. ¿Por qué se cortan mis etiquetas al guardar una figura de Matplotlib?
    Porque Matplotlib no amplía automáticamente el lienzo de la figura cuando las etiquetas se extienden más allá de los límites de los ejes. Es algo común con etiquetas LaTeX o texto rotado.

  2. ¿Qué método soluciona el recorte de etiquetas de forma más fiable en 2025?
    Usa constrained_layout=True para código moderno, o bbox_inches='tight' como arreglo rápido al exportar.

  3. ¿Qué hace bbox_inches="tight"?
    Recalcula la bounding box al guardar, asegurando que se incluyan todos los elementos de texto.