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.

7voto

Jordan Edmunds Points 31

Il est également possible de le faire en utilisant l'interface OOP, en appliquant les règles suivantes tight_layout directement à une figure :

fig, ax = plt.subplots()
fig.set_tight_layout(True)

https://matplotlib.org/stable/api/figure_api.html

7voto

matty T pain Points 762

Vous pouvez également définir un rembourrage personnalisé comme valeur par défaut dans votre $HOME/.matplotlib/matplotlib_rc comme suit. Dans l'exemple ci-dessous, j'ai modifié le rembourrage en bas 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
...

0voto

Pour une raison quelconque, sharex était réglé sur True, je l'ai donc réglé sur False et cela a fonctionné correctement.

df.plot(........,sharex=False)

-3voto

help Points 1

Vous devez utiliser des sizzors pour modifier la portée de l'axe :

import sizzors as sizzors_module

sizzors_module.reshape_the_axis(plt).save("literlymylief.tiff")

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