Cómo ajustar el relleno con etiquetas cortadas o superpuestas

Resuelto Andrew asked hace 13 años • 9 respuestas

MRE actualizado con subtramas

  • No estoy seguro de la utilidad de la pregunta original y del MRE. El relleno de los márgenes parece estar ajustado correctamente para etiquetas x e y grandes.
  • El tema es reproducible con subtramas.
  • Usandomatplotlib 3.4.2
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.show()

ingrese la descripción de la imagen aquí

Original

Estoy trazando un conjunto de datos usando matplotlibdonde tengo una etiqueta x que es bastante "alta" (es una fórmula representada en TeX que contiene una fracción y, por lo tanto, tiene la altura equivalente a un par de líneas de texto).

En cualquier caso, la parte inferior de la fórmula siempre se corta cuando dibujo las figuras. Cambiar el tamaño de la figura no parece ayudar, y no he podido descubrir cómo mover el eje x "hacia arriba" para dejar espacio para la etiqueta x. Algo así sería una solución temporal razonable, pero sería bueno tener una manera de hacer que matplotlib reconozca automáticamente que la etiqueta está cortada y cambie su tamaño en consecuencia.

Aquí hay un ejemplo de lo que quiero decir:

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\nMRE no longer an issue')
plt.show()

ingrese la descripción de la imagen aquí

Toda la etiqueta y es visible, sin embargo, la etiqueta x está cortada en la parte inferior.

En el caso de que se trate de un problema específico de la máquina, lo estoy ejecutando en OSX 10.6.8 con matplotlib 1.0.0

Andrew avatar Jul 21 '11 16:07 Andrew
Aceptado

Usar:

import matplotlib.pyplot as plt

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

# alternate option without .gcf
plt.subplots_adjust(bottom=0.15)

para dejar espacio para la etiqueta, donde plt.gcf()significa obtener la cifra actual . plt.gca(), que obtiene la corriente Axes, también se puede utilizar.

Editar:

Desde que di la respuesta, matplotlibagregué la plt.tight_layout()función.

Consulte los tutoriales de matplotlib: Guía de diseño ajustada

Entonces sugiero usarlo:

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

ingrese la descripción de la imagen aquí

tillsten avatar Jul 21 '2011 13:07 tillsten

En caso de que quieras almacenarlo en un archivo, lo resuelves usando el bbox_inches="tight"argumento:

plt.savefig('myfile.png', bbox_inches="tight")
Guido avatar Oct 01 '2018 08:10 Guido

Una opción sencilla es configurar matplotlib para ajustar automáticamente el tamaño del gráfico. A mí me funciona perfectamente y no sé por qué no está activado por defecto.

Método 1

Configure esto en su archivo matplotlibrc

figure.autolayout : True

Consulte aquí para obtener más información sobre cómo personalizar el archivo matplotlibrc: http://matplotlib.org/users/customizing.html

Método 2

Actualice rcParams durante el tiempo de ejecución de esta manera

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

La ventaja de utilizar este enfoque es que su código producirá los mismos gráficos en máquinas con configuraciones diferentes.

Amit Moscovich avatar Jun 30 '2013 13:06 Amit Moscovich

plt.autoscale()trabajó para mi.

dgoodman1 avatar Feb 13 '2019 18:02 dgoodman1