web-dev-qa-db-fra.com

Pourquoi mon xlabel est-il coupé dans mon graphique matplotlib?

Je trace un jeu de données en utilisant matplotlib où j'ai un xlabel qui est assez "grand" (c'est une formule rendue dans TeX qui contient une fraction et qui a donc la hauteur équivalente à quelques lignes de texte).

Dans tous les cas, le fond de la formule est toujours coupé lorsque je dessine les chiffres. Changer la taille de la figure ne semble pas aider, et je n'ai pas été capable de comprendre comment déplacer l'axe des x "en haut" pour faire de la place pour le xlabel. Une solution de ce genre constituerait une solution temporaire raisonnable, mais ce qui serait bien à Nice serait de disposer d’un moyen de faire en sorte que matplotlib reconnaisse automatiquement que l’étiquette est coupée et redimensionne en conséquence.

Voici un exemple de ce que je veux dire:

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

alors que vous pouvez voir le ylabel entier, le xlabel est coupé en bas.

S'il s'agit d'un problème spécifique à une machine, je l'utilise sous OSX 10.6.8 avec matplotlib 1.0.0.

240
Andrew

Utilisation:

import matplotlib.pyplot as plt

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

faire de la place pour l'étiquette.

Modifier:

Depuis que j'ai donné la réponse, matplotlib a ajouté la fonction tight_layout(). Je suggère donc de l'utiliser:

plt.tight_layout()

devrait faire de la place pour le xlabel.

355
tillsten

Une option simple consiste à configurer matplotlib pour ajuster automatiquement la taille du tracé. Cela fonctionne parfaitement pour moi et je ne sais pas pourquoi il n'est pas activé par défaut.

Méthode 1

Définissez ceci dans votre fichier matplotlibrc

figure.autolayout : True

Voir ici pour plus d'informations sur la personnalisation du fichier matplotlibrc: http://matplotlib.org/users/customizing.html

Méthode 2

Mettez à jour les rcParams pendant l'exécution comme ceci

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

L'avantage d'utiliser cette approche est que votre code produira les mêmes graphiques sur des machines configurées différemment.

126
Amit Moscovich

Si vous souhaitez le stocker dans un fichier, résolvez-le à l'aide de l'argument bbox_inches="tight":

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

Vous pouvez également définir le remplissage personnalisé comme valeurs par défaut dans votre $HOME/.matplotlib/matplotlib_rc comme suit. Dans l'exemple ci-dessous, j'ai modifié à la fois les marges internes inférieure et gauche:

# 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

plt.autoscale() a travaillé pour moi.

2
dgoodman1

Mettre plot.tight_layout() après tous les changements sur le graphique, juste avant show() ou savefig() résoudra le problème.

2
Armin Okić