Ausrichten gedrehter xticklabels mit ihren jeweiligen xticks

140

Überprüfen Sie die x-Achse der folgenden Abbildung. Wie kann ich die Beschriftungen etwas nach links verschieben, damit sie an den jeweiligen Häkchen ausgerichtet sind?

Ich drehe die Etiketten mit:

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

Wie Sie sehen können, ist die Drehung jedoch in der Mitte der Textbeschriftungen zentriert. Das sieht so aus, als wären sie nach rechts verschoben.

Ich habe stattdessen versucht, dies zu verwenden:

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

... aber es macht nicht das, was ich mir gewünscht habe. Und "anchor"scheint der einzige Wert zu sein, der für den rotation_modeParameter zulässig ist.

Beispiel

Filipe Correia
quelle

Antworten:

201

Sie können die horizontale Ausrichtung von Ticklabels festlegen (siehe Beispiel unten). Wenn Sie sich ein rechteckiges Feld um das gedrehte Etikett vorstellen, welche Seite des Rechtecks ​​möchten Sie mit dem Tickpoint ausrichten?

Angesichts Ihrer Beschreibung möchten Sie: ha = 'richtig'

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

Geben Sie hier die Bildbeschreibung ein

Rutger Kassies
quelle
15
Sie können auch verwenden, xlabels = ax.get_xticklabels()wenn Sie nur die vorhandenen Beschriftungen verwenden möchten.
Ben
Danke Rutger, dies ist ein großartiges Beispiel, das mir den Tag gerettet hat!
Alisa
13

Das Drehen der Etiketten ist sicherlich möglich. Beachten Sie jedoch, dass dies die Lesbarkeit des Textes verringert. Eine Alternative besteht darin, die Etikettenpositionen mit einem Code wie dem folgenden zu wechseln:

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)

Geben Sie hier die Bildbeschreibung ein

Weitere Hintergrundinformationen und Alternativen finden Sie in diesem Beitrag in meinem Blog

Boris Gorelik
quelle
9

Eine einfache, schleifenfreie Alternative besteht darin, die horizontalalignmentText-Eigenschaft als Schlüsselwortargument für xticks[1] zu verwenden. In der kommentierten Zeile unten habe ich die xticksAusrichtung auf "richtig" gesetzt.

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

( yticksRichtet den rechten Rand bereits standardmäßig mit dem Häkchen aus, xticksscheint jedoch standardmäßig "Mitte" zu sein.)

[1] Sie finden das in der xticks-Dokumentation beschrieben, wenn Sie nach dem Ausdruck " Texteigenschaften" suchen.

Jeffrey Benjamin Brown
quelle
3

Wenn Sie die xtick-Beschriftungen nicht ändern möchten, können Sie einfach Folgendes verwenden:

plt.xticks(rotation=45)

Pypypie
quelle
3
Es gibt jedoch das gleiche Problem mit falsch ausgerichteten Etiketten. Aber um den Trick von @RutgierCassies zu verwenden, kann man tatsächlichplt.xticks(rotation=45,ha='right')
Frédéric Grosshans