Skip to content

Solucionando el problema de Matplotlib savefig que recorta las etiquetas: Una guía completa

Updated on

Has pasado horas creando el gráfico perfecto en Matplotlib, solo para descubrir que las etiquetas se recortan cuando intentas guardarlo usando la función savefig. Puede ser muy frustrante, especialmente cuando tu xlabel tiene la altura equivalente a un par de líneas de texto y no se muestra correctamente. Pero no te preocupes, has llegado al lugar correcto. En este artículo, exploraremos varios métodos para solucionar el problema donde la función savefig de Matplotlib recorta las etiquetas.

Comprendiendo el problema

Antes de comenzar a resolver el problema, primero entendamos por qué ocurre. Es común usar etiquetas complejas en gráficos científicos o matemáticos, que a menudo se representan utilizando fórmulas TeX. Estas etiquetas pueden ser "altas", es decir, abarcan varias líneas, lo que provoca que la parte inferior de la etiqueta se recorte en la figura guardada. Aquí tienes un ejemplo de un caso así:

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('Ejemplo con Matplotlib 3.4.2\nMRE ya no es un problema')
plt.show()

En este ejemplo, el ylabel es visible, pero el xlabel se recorta en la parte inferior.

El método subplots_adjust

Una solución común a este problema implica ajustar los márgenes del gráfico utilizando la función subplots_adjust. La función subplots_adjust se puede aplicar a la figura actual obtenida mediante plt.gcf() o directamente al gráfico utilizando plt.subplots_adjust(). Así es como se usa:

plt.gcf().subplots_adjust(bottom=0.15)
# o
plt.subplots_adjust(bottom=0.15)

Este método ajusta el margen inferior para hacer espacio al xlabel.

El método tight_layout

Matplotlib ha introducido la función tight_layout que ajusta automáticamente los parámetros del subplot para proporcionar un relleno especificado. Esta función es excelente porque proporciona una solución ordenada al problema de las etiquetas recortadas:

fig, axes = plt.subplots(ncols=2, nrows=2, figsize=(8, 6))
axes = axes.flatten()
 
for ax in axes:
    ax.set_ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
    ax.set_xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$')
 
plt.tight_layout()
plt.show()

Al llamar a plt.tight_layout(), Matplotlib ajusta automáticamente los ejes de los subplots, asegurando que las etiquetas no se superpongan ni se recorten.

Guardar el gráfico con bbox_inches='tight'

Otra forma de asegurarse de que las etiquetas no se recorten al guardar el gráfico es especificar bbox_inches='tight' en la función savefig:

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

Esta opción asegura que todos los elementos del gráfico, incluyendo las etiquetas, se ajusten dentro del cuadro delimitador cuando se guarda el gráfico.

En la siguiente sección, profundizaremos en la configuración automática del diseño de la figura y veremos cómo se puede utilizar para solucionar nuestro problema.

Ajustes automáticos del diseño

Matplotlib ofrece una opción para ajustar automáticamente el diseño de tus gráficos. Esto es particularmente útil cuando deseas que tu código produzca gráficos consistentes en diferentes máquinas configuradas. Así es como puedes configurarlo:

Actualización de rcParams durante la ejecución

Puedes actualizar rcParams durante la ejecución. Esto te permite asegurarte de que la opción de ajuste automático del diseño esté habilitada cuando se ejecute tu código. Así es cómo se hace:

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

Configuración en el archivo Matplotlibrc

Alternativamente, puedes establecer el ajuste automático del diseño directamente en tu archivo matplotlibrc:

figure.autolayout : True

Esta configuración es una excelente manera de garantizar la consistencia en tus gráficos en diferentes máquinas y entornos.

En este momento, deberías tener una buena comprensión de cómo solucionar el problema donde la función savefig de Matplotlib recorta las etiquetas. Recuerda que la mejor solución dependerá de tus necesidades y circunstancias específicas, así que no dudes en experimentar con estos métodos para encontrar el que mejor funcione para ti.

Alternativa a Matplotlib: Visualiza datos con PyGWalker

Además de utilizar Matplotlib para visualizar tus datos en forma de dataframe de pandas, aquí tienes una alternativa, una biblioteca de Python de código abierto que puede ayudarte a crear visualizaciones de datos fácilmente: PyGWalker (opens in a new tab).

PyGWalker para visualización de datos (opens in a new tab)

¡Ya no necesitas realizar complicados procesamientos con código de Python, simplemente importa tus datos y arrastra y suelta variables para crear todo tipo de visualizaciones de datos! Aquí tienes un video de demostración rápida sobre cómo funciona:


Aquí tienes cómo utilizar PyGWalker en tu cuaderno de Jupyter:

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

Alternativamente, puedes probarlo en Kaggle Notebook/Google Colab:

Ejecutar PyGWalker en Kaggle Notebook (opens in a new tab)Ejecutar PyGWalker en Google Colab (opens in a new tab)Dale ⭐️ a PyGWalker en GitHub (opens in a new tab)
Ejecutar PyGWalker en Kaggle Notebook (opens in a new tab)Ejecutar PyGWalker en Google Colab (opens in a new tab)Ejecutar PyGWalker en Google Colab (opens in a new tab)

PyGWalker se basa en el apoyo de nuestra comunidad de código abierto. ¡No olvides visitar PyGWalker en GitHub (opens in a new tab) y darnos una estrella!

Preguntas frecuentes

  1. ¿Por qué se cortan mis etiquetas cuando uso la función savefig en Matplotlib? Esto suele ocurrir cuando tus etiquetas son "altas", como cuando se renderizan utilizando fórmulas TeX y abarcan varias líneas. Matplotlib no ajusta automáticamente los márgenes del gráfico para acomodar estas etiquetas, lo que hace que se corten.

  2. ¿Qué es la función tight_layout en Matplotlib? La función tight_layout es una característica de Matplotlib que ajusta automáticamente los parámetros del subplot para proporcionar un relleno específico. Garantiza que las etiquetas no se superpongan ni se corten.

  3. ¿Qué hace la opción bbox_inches='tight' en la función savefig? La opción bbox_inches='tight' en la función savefig asegura que todos los elementos del gráfico, incluidas las etiquetas, se ajusten dentro del cuadro delimitador cuando se guarda el gráfico. Esto ayuda a evitar que las etiquetas se corten en la figura guardada.