Dopasowywanie obróconych etykiet znaczników do odpowiednich znaczników

140

Sprawdź oś X na poniższym rysunku. Jak mogę przesunąć etykiety nieco w lewo, aby dopasować je do odpowiednich znaczników?

Obracam etykiety za pomocą:

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

Ale, jak widać, obrót jest wyśrodkowany na środku etykiet tekstowych. Co sprawia, że ​​wygląda na to, że są przesunięte w prawo.

Zamiast tego próbowałem użyć tego:

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

... ale nie robi tego, czego chciałem. I "anchor"wydaje się być tylko wartość dopuszczalna dla rotation_modeparametru.

Przykład

Filipe Correia
źródło

Odpowiedzi:

202

Możesz ustawić poziome wyrównanie etykiet, patrz przykład poniżej. Jeśli wyobrażasz sobie prostokątną ramkę wokół obróconej etykiety, która strona prostokąta ma być wyrównana z punktem zaznaczenia?

Biorąc pod uwagę twój opis, chcesz: ha = 'dobrze'

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

wprowadź opis obrazu tutaj

Rutger Kassies
źródło
15
Możesz również użyć, xlabels = ax.get_xticklabels()jeśli chcesz po prostu użyć istniejących etykiet.
Ben
Dzięki Rutger, to świetny przykład, uratował mi dzień!
alisa
13

Obracanie etykiet jest z pewnością możliwe. Należy jednak pamiętać, że takie postępowanie ogranicza czytelność tekstu. Jedną z alternatyw jest zmiana pozycji etykiet przy użyciu takiego kodu:

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)

wprowadź opis obrazu tutaj

Aby uzyskać więcej informacji na temat tła i alternatyw, zobacz ten post na moim blogu

Boris Gorelik
źródło
9

Prostą alternatywą bez pętli jest użycie horizontalalignmentwłaściwości Text jako argumentu słowa kluczowego w xticks[1]. Poniżej, w skomentowanej linii, wymusiłem xtickswyrównanie, aby było „prawidłowe”.

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

( yticksjuż domyślnie wyrównuje prawą krawędź do znacznika, ale xticksdomyślnie wydaje się być „do środka”).

[1] Znajdziesz to opisane w dokumentacji xticks, jeśli szukasz frazy „Właściwości tekstu”.

Jeffrey Benjamin Brown
źródło
3

Jeśli nie chcesz modyfikować etykiet xtick, możesz po prostu użyć:

plt.xticks(rotation=45)

pypypy
źródło
3
Ale ma ten sam problem z nieprawidłowo dopasowanymi etykietami. Ale aby użyć sztuczki @RutgierCassies, rzeczywiście można użyćplt.xticks(rotation=45,ha='right')
Frédéric Grosshans