184 votes

Alignement des onglets d'un tableau d'affichage pivoté avec leurs onglets respectifs.

Vérifiez l'axe des x de la figure ci-dessous. Comment puis-je déplacer les étiquettes un peu vers la gauche pour qu'elles s'alignent sur leurs ticks respectifs ?

Je fais tourner les étiquettes en utilisant :

ax.set_xticks(xlabels_positions)
ax.set_xticklabels(xlabels, rotation=45)

Mais, comme vous pouvez le voir, la rotation est centrée sur le milieu des étiquettes de texte. Ce qui donne l'impression qu'ils sont décalés vers la droite.

J'ai essayé d'utiliser ceci à la place :

ax.set_xticklabels(xlabels, rotation=45, rotation_mode="anchor")

... mais il ne fait pas ce que je souhaitais. Et "anchor" semble être la seule valeur autorisée pour l'option rotation_mode paramètre.

Example

256voto

Rutger Kassies Points 7713

Vous pouvez définir l'alignement horizontal des ticklabels, voir l'exemple ci-dessous. Si vous imaginez une boîte rectangulaire autour de l'étiquette pivotée, de quel côté du rectangle voulez-vous qu'elle soit alignée avec le point de contrôle ?

Compte tenu de votre description, vous voulez : ha='right' (droite)

n=5

x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Ticklabel %i' % i for i in range(n)]

fig, axs = plt.subplots(1,3, figsize=(12,3))

ha = ['right', 'center', 'left']

for n, ax in enumerate(axs):
    ax.plot(x,y, 'o-')
    ax.set_title(ha[n])
    ax.set_xticks(x)
    ax.set_xticklabels(xlabels, rotation=40, ha=ha[n])

enter image description here

27voto

tdy Points 11715

ha='right' n'est pas suffisant pour visuellement aligner les étiquettes avec les tics :

  • Pour rotation=45 utiliser ambos ha='right' y rotation_mode='anchor'
  • Pour les autres angles, utilisez un ScaledTranslation() au lieu de

rotation_mode='anchor'

Si l'angle de rotation est d'environ 45°, combinez ha='right' con rotation_mode='anchor' :

ax.set_xticks(ticks)
ax.set_xticklabels(labels, rotation=45, ha='right', rotation_mode='anchor')

Ou dans matplotlib 3.5.0+, définir les tics et les étiquettes en même temps :

ax.set_xticks(ticks, labels, rotation=45, ha='right', rotation_mode='anchor')

anchored rotation


ScaledTranslation()

Si l'angle de rotation est plus extrême (par exemple, 70°) ou si vous souhaitez simplement un contrôle plus fin, l'ancrage ne fonctionnera pas bien. À la place, appliquer une transformation linéaire :

ax.set_xticks(ticks)
ax.set_xticklabels(labels, rotation=70)

# create -5pt offset in x direction
from matplotlib.transforms import ScaledTranslation
dx, dy = -5, 0
offset = ScaledTranslation(dx / fig.dpi, dy / fig.dpi, fig.dpi_scale_trans)

# apply offset to all xticklabels
for label in ax.xaxis.get_majorticklabels():
    label.set_transform(label.get_transform() + offset)

scaled translation

21voto

bgbg Points 4713

La rotation des étiquettes est certainement possible. Notez cependant que cela réduit la lisibilité du texte. Une alternative consiste à alterner la position des étiquettes en utilisant un code comme celui-ci :

import numpy as np
n=5

x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Long ticklabel %i' % i for i in range(n)]

fig, ax = plt.subplots()
ax.plot(x,y, 'o-')
ax.set_xticks(x)
labels = ax.set_xticklabels(xlabels)
for i, label in enumerate(labels):
    label.set_y(label.get_position()[1] - (i % 2) * 0.075)

enter image description here

Pour plus d'informations et d'alternatives, voir cet article sur mon blog

13voto

Une alternative simple, sans boucle, consiste à utiliser la fonction horizontalalignment La propriété Text en tant qu'argument de mot-clé pour xticks [1]. Dans l'exemple ci-dessous, à la ligne commentée, j'ai forcé l'utilisation de la fonction xticks l'alignement pour être "juste".

n=5
x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Long ticklabel %i' % i for i in range(n)]
fig, ax = plt.subplots()
ax.plot(x,y, 'o-')

plt.xticks(
        [0,1,2,3,4],
        ["this label extends way past the figure's left boundary",
        "bad motorfinger", "green", "in the age of octopus diplomacy", "x"], 
        rotation=45,
        horizontalalignment="right")    # here
plt.show()

( yticks aligne déjà le bord droit avec la coche par défaut, mais pour les xticks la valeur par défaut semble être "centre").

[1] Vous trouvez que décrit dans le Documentation sur les xticks si vous recherchez la phrase "Propriétés du texte".

9voto

Francois Points 133

Je suis clairement en retard mais il existe un exemple officiel qui utilise

plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")

pour faire pivoter les étiquettes tout en les maintenant correctement alignées avec les tics, ce qui est à la fois propre et facile.

Voir : https://matplotlib.org/stable/gallery/images_contours_and_fields/image_annotated_heatmap.html

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