Корректировка положения xticklabel в matplotlib не влияет на x-направление - PullRequest
0 голосов
/ 18 мая 2018

Используя matplotlib 2.2.2 с gridspec в Python 3.6.5, я создал огромный сюжет для исследовательской работы с несколькими подзаговорами.Объекты осей хранятся в словаре с именем axes.Этот словарь передается в функцию adjust_xticklabels(), которая должна выровнять первый xticklabel немного вправо и последний xticklabel немного влево в каждом подзаговоре, так, чтобы xticklabels соседних графиков не мешали друг другу,Функция определяется как:

def adjust_xticklabels(axes, rate = 0.1):

    for ax in axes.values():
        left, right = ax.get_xlim()                  # get boundaries
        dist = right-left                            # get distance
        xtl = ax.get_xticklabels()
        if len(xtl) > 1:
            xtl[0].set_position((left + rate*dist, 0.))   # (x, y), shift right
            xtl[-1].set_position((right - rate*dist, 0.)) # shift left

Вызов ее не имеет никакого эффекта.Конечно, я также попробовал это со смехотворно высокими значениями.Однако, это оказывает влияние в направлении y, например, в случае установки xtl[0].set_position((0.3, 0.3)).

Простое воспроизведение:

ax = plt.subplot(111)
ax.plot(np.arange(10))
xtl = ax.get_xticklabels()
xtl[4].set_position((0.3, 0.3)) # wlog, 4 corresponds to 6

No effect in x-direction, despite specifying position as xy = (0.3, 0.3)

Я потратил много времени, пытаясь выяснить, является ли это особенность или ошибка.Я что-то пропустил или это ошибка?Есть ли другой способ сделать то же самое?

1 Ответ

0 голосов
/ 18 мая 2018

Это функция, без ошибок.Этикетки позиционируются во время ожидания, чтобы сидеть в правильных местах в соответствии с используемым тикером.Это гарантирует, что метка всегда находится там, где расположен соответствующий тик.Если вы изменяете пределы, перемещаете или увеличиваете график, метка всегда следует за этими изменениями.

Обычно вы не собираетесь менять это местоположение, но вы можете, добавив в него пользовательское преобразование.Это описано в Перемещение xp-меток matplotlib на значение пикселя .Общая идея состоит в том, чтобы установить трансляционное преобразование на метке.Например, чтобы перевести вторую метку на 20 пикселей вправо,

import matplotlib.transforms as mtrans
# ...
trans = mtrans.Affine2D().translate(20, 0)
label = ax.get_xticklabels()[1]
label.set_transform(label.get_transform()+trans)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...