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.