Вирівнювання обертових xticklabels з їх відповідними xticks


140

Перевірте вісь x малюнка нижче. Як я можу перемістити мітки трохи вліво, щоб вони вирівнялися відповідно до кліщів?

Я обертаю етикетки, використовуючи:

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

Але, як бачите, обертання зосереджено на середині текстових міток. Це робить його схожим на те, що вони зміщені вправо.

Я намагався використовувати це замість цього:

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

... але це не робить того, чого я хотів. І, "anchor"здається, єдине значення, дозволене для rotation_modeпараметра.

Приклад

Відповіді:


202

Можна встановити горизонтальне вирівнювання галочок, див. Приклад нижче. Якщо ви уявляєте прямокутну коробку навколо обертової мітки, яку сторону прямокутника ви хочете вирівняти з міткою?

З огляду на ваш опис, ви хочете: ha = 'правильно'

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

введіть тут опис зображення


15
Ви також можете використовувати, xlabels = ax.get_xticklabels()якщо ви просто хочете використовувати існуючі мітки.
Бен

Спасибі Рутгер, це чудовий приклад, врятував мені день!
аліса

13

Повернути етикетки, безумовно, можливо. Зауважте, що це робить зменшує читабельність тексту. Однією з альтернатив є чергування позицій міток, використовуючи такий код:

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)

введіть тут опис зображення

Більше інформації та альтернатив див. У цій публікації в моєму блозі


9

Легкою альтернативою без циклу є використання horizontalalignmentвластивості Text як ключового аргументу до xticks[1]. Нижче, у коментованому рядку, я змусив xticksвирівнювання бути "правильним".

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

( yticksвже за замовчуванням вирівнюється правий край із галочкою, але, xticksяк видається, за замовчуванням "центр".)

[1] Ви знайдете те, що описано в документації xticks, якщо шукаєте фразу "Властивості тексту".


3

Якщо ви не хочете змінювати мітки xtick, ви можете просто скористатися:

plt.xticks(rotation=45)


3
Але у нього є та сама проблема неправильно вирівняних етикеток. Але, щоб використовувати хитрість @RutgierCassies, справді можна скористатисяplt.xticks(rotation=45,ha='right')
Frédéric Grosshans
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.