Alinhando os marcadores xtick girados com seus respectivos xticks

140

Verifique o eixo x da figura abaixo. Como posso mover os rótulos um pouco para a esquerda para que eles se alinhem com seus respectivos ticks?

Estou girando os rótulos usando:

ax.set_xticks(xlabels_positions)
ax.set_xticklabels(xlabels, rotation=45)

Mas, como você pode ver, a rotação está centralizada no meio dos rótulos de texto. O que faz parecer que eles são deslocados para a direita.

Eu tentei usar isso:

ax.set_xticklabels(xlabels, rotation=45, rotation_mode="anchor")

... mas não faz o que eu desejava. E "anchor"parece ser o único valor permitido para o rotation_modeparâmetro.

Exemplo

Filipe Correia
fonte

Respostas:

202

Você pode definir o alinhamento horizontal dos ticklabels, veja o exemplo abaixo. Se você imaginar uma caixa retangular ao redor do rótulo girado, qual lado do retângulo deseja alinhar com o ponto de visto?

Dada a sua descrição, você deseja: 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])

insira a descrição da imagem aqui

Rutger Kassies
fonte
15
Você também pode usar xlabels = ax.get_xticklabels()se você quiser apenas usar os rótulos existentes.
Ben
Obrigado Rutger, este é um ótimo exemplo, salvou o meu dia!
Alisa
13

Girar as etiquetas é certamente possível. Observe que isso reduz a legibilidade do texto. Uma alternativa é alternar posições de etiqueta usando um código como este:

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)

insira a descrição da imagem aqui

Para mais informações e alternativas, consulte este post no meu blog

Boris Gorelik
fonte
9

Uma alternativa fácil e sem loop é usar a horizontalalignmentpropriedade Text como argumento de palavra-chave para xticks[1]. Abaixo, na linha comentada, forcei o xticksalinhamento a estar "certo".

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

( yticksjá alinha a borda direita com o tique por padrão, mas xtickso padrão parece ser "central".)

[1] Você encontra o descrito na documentação do xticks se procurar pela frase "Propriedades do texto".

Jeffrey Benjamin Brown
fonte
3

Se você não deseja modificar os rótulos do xtick, basta usar:

plt.xticks(rotation=45)

pypypy
fonte
3
Mas tem o mesmo problema de etiquetas alinhadas incorretamente. Mas, para usar o truque de @RutgierCassies, pode-se de fato usarplt.xticks(rotation=45,ha='right')
Frédéric Grosshans 23/03