Выравнивание повернутых меток xticklabels с соответствующими метками xticks

146

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

Я поворачиваю этикетки, используя:

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

Но, как вы можете видеть, вращение происходит по центру текстовых меток. Из-за этого кажется, что они смещены вправо.

Вместо этого я пробовал использовать это:

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

... но это не то, что я хотел. И, "anchor"похоже, это единственное допустимое значение rotation_modeпараметра.

пример

Филипе Коррейя
источник

Ответы:

212

Вы можете установить горизонтальное выравнивание меток, см. Пример ниже. Если вы представите прямоугольную рамку вокруг повернутой метки, какую сторону прямоугольника вы хотите выровнять с отметкой?

Учитывая ваше описание, вы хотите: 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])

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

Рутгер Кэссис
источник
15
Вы также можете использовать, xlabels = ax.get_xticklabels()если хотите использовать существующие метки.
Бен
Спасибо, Рутгер, это отличный пример, спас мне день!
Алиса
14

Вращение этикеток, безусловно, возможно. Обратите внимание, что это снижает удобочитаемость текста. Одна альтернатива - чередовать позиции меток с помощью такого кода:

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, если будете искать фразу «Свойства текста».

Джеффри Бенджамин Браун
источник
5

Если вы не хотите изменять метки xtick, вы можете просто использовать:

plt.xticks(rotation=45)

пыпыпы
источник
3
Но у него та же проблема с неправильно выровненными этикетками. Но, чтобы использовать уловку @RutgierCassies, действительно можно использоватьplt.xticks(rotation=45,ha='right')
Фредерик Гроссханс