¿Por qué se corta mi xlabel en mi parcela matplotlib?

303

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 a esto, y no he sido capaz de descubrir cómo desplazar el eje x "hacia arriba" para dejar espacio para la etiqueta x. Algo así sería una solución temporal razonable, pero lo que sería bueno sería tener una manera de hacer que matplotlib reconozca automáticamente que la etiqueta se corta y se redimensiona 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)$')
plt.show()

Si bien puede ver toda la etiqueta, la etiqueta x se corta en la parte inferior.

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

Andrés
fuente
44
Puede publicar en un sitio de alojamiento de imágenes y vincularlo aquí.
agf
1
Ayuda si puede publicar un código de muestra minimalista que desencadena este problema. De esta manera, las personas pueden entender y reproducir su problema más rápido, y es más probable que lo ayuden.
Denilson Sá Maia
Su código funciona bien (mostrar la fórmula totalmente visible) en mi máquina (ubuntu 11.04 64bit). ¿Quizás es un problema específico de la máquina [como una fuente con información dimensional incorrecta utilizada en la imagen?]. Quizás podría especificar el sistema que está utilizando en su pregunta.
mac
99
también puede probar plt.savefig("test.png",bbox_inches='tight'): stackoverflow.com/questions/21288062/…
Yibo Yang

Respuestas:

475

Utilizar:

import matplotlib.pyplot as plt

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

para dejar espacio a la etiqueta.

Editar:

Desde que di la respuesta, matplotlibha agregado la tight_layout()función. Así que sugiero usarlo:

plt.tight_layout()

debería dejar espacio para la etiqueta.

tillsten
fuente
141
Me parece bastante extraño que uno tenga que hacer una llamada extra para hacer espacio para una parte esencial de una trama. ¿Cuál es el razonamiento detrás de esto?
un ben diferente
3
Solo por curiosidad, ¿por qué tienes gcf().subplots_adjustmás que plt.subplots_adjust? ¿Hay una diferencia?
enebro-
49
¿Qué son gcfy gca? ¡Olvidaste explicarlo!
Coronel Panic
12
Me enfrenté al mismo problema, y ​​aunque tight_layout()solucioné el corte de las etiquetas, desafortunadamente causó que mi etiqueta se cortara (que no estaba cortada antes). Sin embargo, el primer remedio ( subplots_adjust(bottom=0.25)) funcionó bien. Gracias.
Scott H
17
@ColonelPanic gcf()y gca()son "obtener la figura actual" y "obtener los ejes actuales", respectivamente.
DrMisha
150

Una opción fácil es configurar matplotlib para ajustar automáticamente el tamaño de la trama. Funciona perfectamente para mí y no estoy seguro de por qué no está activado por defecto.

Método 1

Establezca esto en su archivo matplotlibrc

figure.autolayout : True

Consulte aquí para obtener más información sobre la personalización del archivo matplotlibrc: http://matplotlib.org/users/customizing.html

Método 2

Actualice los 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 configuradas de manera diferente.

Amit Moscovich
fuente
Tuve algunos problemas con las barras de colores demasiado grandes al usar esta opción. Aquí se discute una posible solución: matplotlib.org/users/tight_layout_guide.html
PiQuer el
2
tight_layout hace un desastre cuando configuro tamaños de fuente personalizados (¡grandes!). Esto hace un trabajo mucho mejor.
BenB
Actualizar rcParams fue realmente lo único que funcionó para mí cuando utilicé pgf backend con LaTeX. (aunque hace que la trama sea rectangular, lo que no me importa)
h4nek
Solo esto funcionó para mí; ninguno de tight_layout o box_inches funcionó
zed111
106

En caso de que desee almacenarlo en un archivo, lo resuelve utilizando el bbox_inches="tight"argumento:

plt.savefig('myfile.png', bbox_inches = "tight")
Guido
fuente
2
@Guido salvó el día
pcko1
7

Poner plot.tight_layout()después de todos los cambios en el gráfico, justo antes show()o savefig()resolverá el problema.

Armin Okić
fuente
1
Esto no deja espacio para la parte inferior de la trama, sino que cambia la escala de la trama completa, lo que en algunos casos (como el mío) puede hacer que la trama se vea realmente extraña.
89f3a1c
6

plt.autoscale() trabajó para mi.

dgoodman1
fuente
5

También puede establecer el relleno personalizado como predeterminado en su de la $HOME/.matplotlib/matplotlib_rcsiguiente manera. En el ejemplo a continuación, modifiqué el relleno original inferior e izquierdo:

# The figure subplot parameters.  All dimensions are a fraction of the
# figure width or height
figure.subplot.left  : 0.1 #left side of the subplots of the figure
#figure.subplot.right : 0.9 
figure.subplot.bottom : 0.15
...
Мати Тернер
fuente