Aligner les xticklabels tournés avec leurs xticks respectifs

Vérifiez l’axe x de la figure ci-dessous. Comment puis-je déplacer les étiquettes un peu vers la gauche pour qu’elles soient alignées avec 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 ça ne fait pas ce que je souhaitais. Et "anchor" semble être la seule valeur autorisée pour le paramètre rotation_mode .

Exemple

Vous pouvez définir l’alignement horizontal des barres d’affichage, voir l’exemple ci-dessous. Si vous imaginez une boîte rectangular autour de l’étiquette pivotée, quel côté du rectangle souhaitez-vous aligner avec le point d’interrogation?

Compte tenu de votre description, vous voulez: ha = ‘right’

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

entrer la description de l'image ici

La rotation des étiquettes est certainement possible. Notez que cela réduit la lisibilité du texte. Une alternative consiste à alterner les positions 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) 

entrer la description de l'image ici

Pour plus d’arrière-plan et d’alternatives, voir cet article sur mon blog

Une alternative simple et sans boucle consiste à utiliser la propriété Text horizontalalignment comme argument de mot-clé pour xticks [1]. Dans la ligne ci-dessous, à la ligne commentée, j’ai forcé l’alignement de xticks à être “correct”.

 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 le tick par défaut, mais pour xticks la valeur par défaut semble être “center”.)

[1] Vous trouvez cela dans la documentation de xticks si vous recherchez l’expression “Propriétés du texte”.