Рассчитать координаты xy для аннотирования графика ствола - PullRequest
0 голосов
/ 17 февраля 2020

Фон:

Я создал гистограмму следующим образом:

  • ось x: numbers (ndarray)
  • ось y: число frequencies (ndarray)
  • каждая полоса частоты имеет фактическое значение, аннотированное вверху соответствующей полосы; Для этого была создана пользовательская функция annotations(), которая использует plt.bar функции get_x, get_height, get_width для вычисления точного положения, в котором будет размещена моя метка

Используя plt. bar (): - это прекрасно работает

numbers=np.array([1,2,3, 4, 5, 6, 7, 8, 9,10,11,12])
frequencies=np.array([233,266,261,220,245,231,235,263,246,169,159, 58])

x = np.arange(1,len(numbers)+1)
bars=plt.bar(x, frequencies, width=0.5)

plt.xticks(numbers)

def annotations():
    for bar in bars:
        height = bar.get_height()
        plt.annotate('{}'.format(height),
                    xy=(bar.get_x() + bar.get_width() / 2, height),
                    xytext=(0, 1),  # 1 points vertical offset
                    textcoords="offset points",
                    ha='center', va='bottom')

annotations()

#plt.hist(frequencies, numbers)

plt.show()

Гистограмма:

bar chart

Цель: Создать Стволовую диаграмму с аннотированными метками на каждом стебле, аналогично гистограмме выше .

My plt. ствол ():

x = np.arange(1, len(numbers) + 1)  # the label locations; needs to start at 1, not 0
print(x)
stems = plt.stem(x, frequencies)

stem chart

Вопрос: Как рассчитать правильные координаты XY на стволе диаграмма для размещения пользовательских меток, в данном случае frequencies? Ограничение здесь состоит в том, что, в отличие от plt.bar (), plt.stem () не имеет get_x, get_height() функций.

1 Ответ

1 голос
/ 17 февраля 2020

У вас уже есть высота стеблей в вашей переменной frequencies, поэтому вам не нужно пытаться извлечь их из артистов.

numbers=np.array([1,2,3, 4, 5, 6, 7, 8, 9,10,11,12])
frequencies=np.array([233,266,261,220,245,231,235,263,246,169,159, 58])

stems = plt.stem(numbers, frequencies)
plt.xticks(numbers, numbers)
for x,y in zip(numbers, frequencies):
    plt.annotate('{:.0f}'.format(y), xy=(x,y), xytext=(0,5), textcoords='offset points',ha='center')

enter image description here

PS: как прокомментировал @ImportanceOfBeingErnest, это также относится и к вашему барплоту, вы можете использовать точно такой же код для аннотирования гистограммы.

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