480 votes

Comment ajuster le remplissage avec des étiquettes qui se coupent ou se chevauchent ?

Mise à jour de l'ERM avec les intrigues secondaires

  • Je ne suis pas sûr de l'utilité de la question initiale et de l'ERM. La marge de remplissage semble être correctement ajustée pour les grandes étiquettes x et y.
  • Le problème peut être reproduit avec les sous-parcelles.
  • L'utilisation 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()

enter image description here

Original

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

En tout état de cause, le bas de la formule est toujours coupé lorsque je dessine les chiffres. Changer la taille de la figure ne semble pas arranger les choses, et je n'ai pas réussi à trouver comment décaler l'axe des x "vers le haut" pour faire de la place à l'étiquette des x. Quelque chose comme ça serait une solution temporaire raisonnable, mais ce qui serait bien, ce serait d'avoir 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)$', fontsize=50)
plt.title('Example with matplotlib 3.4.2\nMRE no longer an issue')
plt.show()

enter image description here

L'ensemble de l'étiquette y est visible, mais l'étiquette x est coupée en bas.

Au cas où il s'agirait d'un problème spécifique à la machine, j'utilise OSX 10.6.8 avec matplotlib 1.0.0.

5 votes

Vous pouvez le poster sur un site d'hébergement d'images et le lier ici.

1 votes

Il serait utile que vous puissiez poster 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 enclins à vous aider.

0 votes

Votre code fonctionne parfaitement (affichage de la formule entièrement visible) sur ma machine (ubuntu 11.04 64bit). Il s'agit peut-être d'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 préciser le système que vous utilisez dans votre question.

670voto

tillsten Points 1861

Utiliser :

import matplotlib.pyplot as plt

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

# alternate option without .gcf
plt.subplots_adjust(bottom=0.15)

pour faire de la place à l'étiquette, où plt.gcf() moyens obtenir le chiffre actuel . plt.gca() qui obtient la valeur actuelle de la Axes peut également être utilisé.

Edita:

Puisque j'ai donné la réponse, matplotlib a ajouté le plt.tight_layout() fonction.

Voir les tutoriels de matplotlib : Guide de mise en page serrée

Je suggère donc de l'utiliser :

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

enter image description here

184 votes

Je trouve assez bizarre qu'il faille faire un appel supplémentaire pour faire de la place à un élément essentiel de l'intrigue. Quel est le raisonnement derrière cela ?

5 votes

Juste par curiosité, pourquoi avez-vous gcf().subplots_adjust plutôt que plt.subplots_adjust ? Y a-t-il une différence ?

1 votes

Non, il n'y a pas de différence.

327voto

Guido Points 828

Si vous souhaitez l'enregistrer dans un fichier, vous pouvez le faire en utilisant la méthode suivante bbox_inches="tight" argument :

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

203voto

Une option simple consiste à configurer matplotlib pour qu'il ajuste automatiquement la taille du graphique. Cela fonctionne parfaitement pour moi et je ne sais pas pourquoi ce 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

Mettre à jour les rcParams pendant l'exécution comme suit

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

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

1 votes

J'ai eu quelques problèmes avec des barres de couleurs trop grandes lorsque j'utilisais cette option. Une solution possible est discutée ici : matplotlib.org/users/tight_layout_guide.html

2 votes

Tight_layout met le bazar lorsque je définis des tailles de polices (grandes !) personnalisées. Ceci fait un bien meilleur travail.

1 votes

La mise à jour de rcParams est vraiment la seule chose qui a fonctionné pour moi lorsque j'ai utilisé le backend pgf avec LaTeX. (même si cela rend le tracé rectangulaire, ce qui ne me dérange pas).

11voto

Armin Okić Points 41

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

10voto

dgoodman1 Points 106

plt.autoscale() a fonctionné pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X