Vérifiez l’axe des x de la figure ci-dessous. Comment puis-je déplacer les étiquettes un peu vers la gauche afin qu'elles s'alignent avec leurs ticks respectifs?
Je tourne les étiquettes en utilisant:
ax.set_xticks(xlabels_positions)
ax.set_xticklabels(xlabels, rotation=45)
Mais, comme vous pouvez le constater, 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
.
Vous pouvez définir l'alignement horizontal des étiquettes de sélection, voir l'exemple ci-dessous. Si vous imaginez une boîte rectangulaire autour de l'étiquette pivotée, quel côté du rectangle souhaitez-vous aligner avec le tickpoint?
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])
Faire pivoter les étiquettes est certainement possible. Notez cependant 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)
Pour plus d'informations et d'alternatives, voir cet article sur mon blog
Une alternative simple et sans boucle consiste à utiliser la propriété horizontalalignment
Text en tant qu'argument de mot clé pour xticks
[1]. En bas, à la ligne commentée, j'ai forcé l'alignement 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 la coche par défaut, mais pour xticks
, la valeur par défaut semble être "centre".)
[1] Vous trouvez cela décrit dans la documentation de xticks si vous recherchez la phrase "Propriétés du texte".