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


Estoy trazando un conjunto de datos usando matplotlib donde tengo un xlabel que es bastante "alto" (es una fórmula renderizada 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 averiguar cómo cambiar el eje x "hacia arriba" para hacer espacio para el xlabel. Algo así sería un 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 está cortada y cambie el 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)$')
plt.show()

Mientras se puede ver todo el ylabel, el xlabel está cortado en la parte inferior.

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

Author: Hooked, 2011-07-21

5 answers

Uso:

import matplotlib.pyplot as plt

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

Para hacer espacio para la etiqueta.

Editar:

Desde que di la respuesta, matplotlib ha añadido la tight_layout() función. Así que sugiero usarlo:

plt.tight_layout()

Debería hacer espacio para el xlabel.

 260
Author: tillsten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-29 07:26:00

Una opción fácil es configurar matplotlib para ajustar automáticamente el tamaño de la parcela. 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 cómo personalizar el archivo matplotlibrc: http://matplotlib.org/users/customizing.html

Método 2

Actualizar los rcParams durante el tiempo de ejecución de esta manera

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

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

 100
Author: Amit Moscovich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-30 13:28:48

También puede configurar el relleno personalizado como predeterminado en su $HOME/.matplotlib/matplotlib_rc de la siguiente manera. En el ejemplo a continuación he modificado tanto la parte inferior como la izquierda de relleno fuera de la caja:

# 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
...
 5
Author: Мати Тернер,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-15 00:36:04

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

 1
Author: Armin Okić,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 14:29:25

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

plt.savefig('myfile.png', bbox_inches = "tight")
 0
Author: Guido,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-01 08:57:45