Cómo ajustar el relleno con etiquetas cortadas o superpuestas
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.
- Usando
matplotlib 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()
Original
Estoy trazando un conjunto de datos usando matplotlib
donde 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()
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
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, matplotlib
agregué 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()
En caso de que quieras almacenarlo en un archivo, lo resuelves usando el bbox_inches="tight"
argumento:
plt.savefig('myfile.png', bbox_inches="tight")
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.
plt.autoscale()
trabajó para mi.