Галочки и метки в разных положениях на оси - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь создать фигуру, на которой я хотел бы иметь метки, а также метки по оси X, но в разных позициях. Однако, похоже, что после установки первых тиков, при попытке определить новые тики, предыдущие «забываются». Например:

import matplotlib.pyplot as plt

xs = [1, 4, 7, 11, 14, 17, 20, 23, 26, 29]
ys = [2.0, 1.667, 2.0, 0.333, 1.0, 0.667, 1.667, 1.0, 1.0, 1.0]

# where we want our labels
ticks1 = [5.0, 15.0, 25.0]
labs = ['A', 'B', 'C']

fig, ax = plt.subplots()
ax.plot(xs, ys)

# I think I have to define ticks here to position the labels...
ax.set_xticks(ticks1)
ax.set_xticklabels(labs)

ax.tick_params(axis='x', length=0)

plt.show()

enter image description here

Пока все хорошо, с желаемой договоренностью. ABC используются для обозначения различных групп точек данных, и они находятся в большей или меньшей степени в середине каждой соответствующей группы (позже я добавлю вертикальные линии, чтобы сделать это разделение более очевидным), но галочки должны отражать данные, а не эти искусственные этикетки.

Но если я попытаюсь теперь добавить другой набор тиков к той же оси, метки, показанные выше, переносятся на новые тики и не сохраняют свою прежнюю позицию:

# ...but want to have ticks for this range
ticks2 = [x for x in range(0, 33, 3)]
ax.set_xticks(ticks2)
ax.tick_params(axis='x', length=5)

plt.show()

enter image description here

Как правильно достичь желаемого результата в matplotlib?

1 Ответ

0 голосов
/ 08 ноября 2018

Оси Matplotlib отмечаются с помощью локаторов и форматеров. Локатор сообщает оси, куда ставить галочки. Форматировщик ставит метку на эти галочки.

При использовании ax.set_xticks вы создаете FixedLocator, то есть набор фиксированных местоположений для отметки.
При использовании ax.set_xticklabels вы создаете FixedFormatter, то есть набор фиксированных строк для размещения по одному на галочках.

Когда вы устанавливаете новые тики с помощью ax.set_xticks(ticks2), вы не меняли форматер. Он по-прежнему будет форматировать первые три галочки со строками из своего списка.
Это значит: вам также нужно установить новые метки для измененного регистра.

например. через

ax.set_xticklabels(list("ABCDEFGHIJ"))

Теперь, если вы хотите иметь метки в других позициях, отличных от меток, это по сути означает, что вам нужны две пары локаторов и форматеров.

Одна пара локатор-форматер помечает кратные 3 и использует пустые строки в качестве меток. Другая пара отметит 5,15,25 и установит для них метки A, B, C.

import matplotlib.pyplot as plt

xs = [1, 4, 7, 11, 14, 17, 20, 23, 26, 29]
ys = [2.0, 1.667, 2.0, 0.333, 1.0, 0.667, 1.667, 1.0, 1.0, 1.0]

fig, ax = plt.subplots()
ax.plot(xs, ys)

# Major ticks
ticks2 = [x for x in range(0, 33, 3)]
ax.set_xticks(ticks2)
ax.set_xticklabels([])
ax.tick_params(axis='x', which="major", length=5)

# Minor ticks
ticks1 = [5.0, 15.0, 25.0]
labs = ['A', 'B', 'C']
ax.set_xticks(ticks1, minor=True)
ax.set_xticklabels(labs, minor=True)
ax.tick_params(axis='x', which="minor",length=0)


plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...