Menyelaraskan xticklabel yang diputar dengan masing-masing xtick


140

Periksa sumbu x pada gambar di bawah ini. Bagaimana saya bisa memindahkan label sedikit ke kiri sehingga mereka sejajar dengan kutu masing-masing?

Saya memutar label menggunakan:

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

Tapi, seperti yang Anda lihat, rotasi dipusatkan di tengah label teks. Yang membuatnya terlihat seperti mereka bergeser ke kanan.

Saya malah mencoba menggunakan ini:

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

... tapi itu tidak melakukan apa yang saya harapkan. Dan "anchor"tampaknya hanya nilai yang diizinkan untuk rotation_modeparameter.

Contoh

Jawaban:


202

Anda dapat mengatur perataan horizontal ticklabels, lihat contoh di bawah ini. Jika Anda membayangkan kotak persegi panjang di sekitar label yang diputar, sisi persegi panjang mana yang ingin Anda selaraskan dengan titik centang?

Dengan uraian Anda, Anda ingin: ha = 'benar'

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

masukkan deskripsi gambar di sini


15
Anda juga dapat menggunakan xlabels = ax.get_xticklabels()jika Anda hanya ingin menggunakan label yang ada.
Ben

Terima kasih Rutger, ini adalah contoh yang bagus, menyelamatkan hari saya!
alisa

13

Memutar label tentu saja mungkin. Perhatikan bahwa melakukan hal itu mengurangi keterbacaan teks. Salah satu alternatif adalah mengganti posisi label menggunakan kode seperti ini:

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)

masukkan deskripsi gambar di sini

Untuk latar belakang dan alternatif lainnya, lihat posting ini di blog saya


9

Alternatif mudah dan bebas loop adalah dengan menggunakan horizontalalignmentproperti Text sebagai argumen kata kunci untuk xticks[1]. Di bawah ini, di baris komentar, saya telah memaksa xticksperataan menjadi "benar".

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

( ytickssudah menyejajarkan tepi kanan dengan centang secara default, tetapi untuk xticksdefault tampaknya "tengah".)

[1] Anda menemukan hal yang dijelaskan dalam dokumentasi xticks jika Anda mencari frasa "Properti teks".


3

Jika Anda tidak ingin memodifikasi label xtick, Anda bisa menggunakan:

plt.xticks(rotation=45)


3
Tetapi memiliki masalah yang sama dari label yang tidak lurus. Tetapi, untuk menggunakan trik @RutgierCassies, seseorang memang bisa menggunakanplt.xticks(rotation=45,ha='right')
Frédéric Grosshans
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.