Allineamento di xticklabels ruotati con i rispettivi xtick


140

Controllare l'asse x della figura seguente. Come posso spostare leggermente le etichette a sinistra in modo che si allineino con le rispettive zecche?

Sto ruotando le etichette usando:

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

Ma, come puoi vedere, la rotazione è centrata al centro delle etichette di testo. Il che fa sembrare che siano spostati a destra.

Ho provato a usare questo invece:

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

... ma non fa quello che desideravo. E "anchor"sembra essere l'unico valore consentito per il rotation_modeparametro.

Esempio

Risposte:


202

È possibile impostare l'allineamento orizzontale dei segni di spunta, vedere l'esempio seguente. Se immagini una scatola rettangolare attorno all'etichetta ruotata, quale lato del rettangolo vuoi allineare con il segno di spunta?

Data la tua descrizione, vuoi: 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])

inserisci qui la descrizione dell'immagine


15
È inoltre possibile utilizzare xlabels = ax.get_xticklabels()se si desidera utilizzare solo le etichette esistenti.
Ben

Grazie Rutger, questo è un ottimo esempio, mi ha salvato la giornata!
alisa,

13

La rotazione delle etichette è certamente possibile. Si noti tuttavia che ciò riduce la leggibilità del testo. Un'alternativa è alternare le posizioni delle etichette usando un codice come questo:

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)

inserisci qui la descrizione dell'immagine

Per ulteriori informazioni e alternative, vedi questo post sul mio blog


9

Un'alternativa semplice e senza loop consiste nell'utilizzare la horizontalalignmentproprietà Text come argomento della parola chiave per xticks[1]. Di seguito, nella riga commentata, ho forzato l' xticksallineamento a "giusto".

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

( yticksper impostazione predefinita allinea già il bordo destro con il segno di spunta, ma per xticksimpostazione predefinita sembra essere "centrale").

[1] Lo trovi descritto nella documentazione di xticks se cerchi la frase "Proprietà del testo".


3

Se non vuoi modificare le etichette xtick, puoi semplicemente usare:

plt.xticks(rotation=45)


3
Ma ha lo stesso problema di etichette erroneamente allineate. Ma, per usare il trucco di @RutgierCassies, si può davvero usareplt.xticks(rotation=45,ha='right')
Frédéric Grosshans il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.