Alignement des xticklabels pivotés avec leurs xtick respectifs


140

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 s'alignent avec leurs graduations respectives?

Je fais pivoter 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 rotation_modeparamètre.

Exemple

Réponses:


202

Vous pouvez définir l'alignement horizontal des étiquettes, 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 être aligné avec le point de repère?

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

entrez la description de l'image ici


15
Vous pouvez également utiliser xlabels = ax.get_xticklabels()si vous souhaitez simplement utiliser les étiquettes existantes.
— Ben

Merci Rutger, ceci est un excellent exemple, m'a sauvé la journée!
— alisa

13

La rotation des é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)

entrez la description de l'image ici

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


9

Une alternative simple et sans boucle consiste à utiliser la horizontalalignmentpropriété Text comme argument de mot-clé pour xticks[1]. Dans ce qui suit, à la ligne commentée, j'ai forcé l' xticksalignement à être "droit".

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

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

[1] Vous trouvez cela décrit dans la documentation de xticks si vous recherchez l'expression "Propriétés du texte".


3

Si vous ne souhaitez pas modifier les étiquettes xtick, vous pouvez simplement utiliser:

plt.xticks(rotation=45)


3
Mais il a le même problème d'étiquettes mal alignées. Mais, pour utiliser le truc de @RutgierCassies, on peut en effet utiliserplt.xticks(rotation=45,ha='right')
— Frédéric Grosshans
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.