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

303

Je trace un ensemble de données en utilisant matplotliboù j'ai un xlabel qui est assez "grand" (c'est une formule rendue dans TeX qui contient une fraction et a donc l'équivalent en hauteur de quelques lignes de texte).

Dans tous les cas, le bas de la formule est toujours coupé lorsque je dessine les chiffres. Changer la taille de la figure ne semble pas aider cela, et je n'ai pas été en mesure de comprendre comment déplacer l'axe x "vers le haut" pour faire de la place pour le xlabel. Quelque chose comme ça serait une solution temporaire raisonnable, mais ce qui serait bien serait d'avoir un moyen pour que matplotlib reconnaisse automatiquement que l'étiquette est coupée et redimensionnée 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()

tandis que vous pouvez voir l'intégralité du ylabel, le xlabel est coupé en bas.

Dans le cas où il s'agit d'un problème spécifique à la machine, je l'exécute sur OSX 10.6.8 avec matplotlib 1.0.0

Andrew
la source
4
Vous pouvez publier sur un site d'hébergement d'images et le lier ici.
agf
1
Cela peut être utile si vous pouvez publier un exemple de code minimaliste qui déclenche ce problème. De cette façon, les gens peuvent comprendre et reproduire votre problème plus rapidement et ils seront plus susceptibles de vous aider.
Denilson Sá Maia
Votre code fonctionne très bien (affichez la formule entièrement visible) sur ma machine (ubuntu 11.04 64bit). Peut-être est-ce un problème spécifique à la machine [comme une police avec des informations dimensionnelles erronées utilisées dans l'image?]. Vous pourriez peut-être spécifier le système que vous utilisez dans votre question.
mac
9
vous pouvez également essayer plt.savefig("test.png",bbox_inches='tight'): stackoverflow.com/questions/21288062/…
Yibo Yang

Réponses:

475

Utilisation:

import matplotlib.pyplot as plt

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

pour faire de la place au label.

Éditer:

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

plt.tight_layout()

devrait faire de la place pour le xlabel.

tillsten
la source
141
Je trouve assez étrange que l'on ait besoin de faire un appel supplémentaire pour faire de la place pour une partie essentielle d'une intrigue. Quel est le raisonnement derrière cela?
un autre ben
3
Par curiosité, pourquoi en avez-vous gcf().subplots_adjustplutôt que plt.subplots_adjust? Y a-t-il une différence?
juniper-
49
Quels sont gcfet gca? Vous avez négligé d'expliquer!
Colonel Panic
12
J'ai été confronté au même problème, et bien que tight_layout()j'ai corrigé la coupure des xlabels, cela a malheureusement causé la coupure de mon ylabel (ce qui n'était pas le cas auparavant). Cependant, le premier remède ( subplots_adjust(bottom=0.25)) a bien fonctionné. Merci.
Scott H
17
@ColonelPanic gcf()et gca()sont respectivement "get current figure" et "get current axes".
DrMisha
150

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

Réglez cela 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.

Amit Moscovich
la source
J'ai eu quelques problèmes avec des barres de couleurs trop grandes lors de l'utilisation de cette option. Une solution possible est discutée ici: matplotlib.org/users/tight_layout_guide.html
PiQuer
2
tight_layout fait un gâchis quand je mets des tailles de police personnalisées (grandes!). Cela fait un bien meilleur travail.
BenB
La mise à jour de rcParams était vraiment la seule chose qui fonctionnait pour moi lors de l'utilisation du backend pgf avec LaTeX. (même si cela rend l'intrigue rectangulaire, ce qui ne me dérange pas)
h4nek
Seulement cela a fonctionné pour moi; aucun de tight_layout ou box_inches n'a fonctionné
zed111
106

Dans le cas où vous souhaitez le stocker dans un fichier, vous le résolvez en utilisant l' bbox_inches="tight"argument:

plt.savefig('myfile.png', bbox_inches = "tight")
Guido
la source
2
@Guido a sauvé la journée
pcko1
7

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

Armin Okić
la source
1
Cela ne fait pas de place pour le bas de l'intrigue, mais il redimensionne plutôt l'ensemble de l'intrigue, ce qui peut dans certains cas (comme le mien) rendre l'intrigue vraiment bizarre.
89f3a1c
6

plt.autoscale() travaillé pour moi.

dgoodman1
la source
5

Vous pouvez également définir le remplissage personnalisé comme valeurs par défaut dans votre $HOME/.matplotlib/matplotlib_rccomme suit. Dans l'exemple ci-dessous, j'ai modifié le rembourrage inférieur et gauche prêt à l'emploi:

# 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
...
Мати Тернер
la source