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

Filipe Correia
la source

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

Rutger Kassies
la source
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

Boris Gorelik
la source
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".

Jeffrey Benjamin Brown
la source
3

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

plt.xticks(rotation=45)

pypypy
la source
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