длина динамической опорной линии гистограммы

У меня есть опорная линия на гистограмме, но я хочу, чтобы эта линия динамически корректировалась в зависимости от длины индекса оси X. Я бы хотел, чтобы линия начиналась с левого края самой левой полосы и заканчивалась у правого края самой правой полосы. Я заметил, что когда значение ind (index) меняется, я не могу точно выполнить корректировку, используя процент от ind или константу для аргументов xmin и xmax.

Вот пример, слегка измененный с сайта matplotlib: http://matplotlib.org/examples/pylab_examples/bar_stacked.html

import numpy as np
import matplotlib.pyplot as plt


N = 5
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
menStd = (2, 3, 4, 1, 2)
womenStd = (3, 5, 2, 3, 3)
ind = np.arange(N)    # the x locations for the groups
width = 0.35       # the width of the bars: can also be len(x) sequence

p1 = plt.bar(ind, menMeans, width, color='r', yerr=menStd)
p2 = plt.bar(ind, womenMeans, width, color='y',
             bottom=menMeans, yerr=womenStd)

#How do I adjust the length of this line dynamically?
plt.axhline(linewidth=1, color='b', y=np.average(menMeans))
plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(ind + width/2., ('G1', 'G2', 'G3', 'G4', 'G5'))
plt.yticks(np.arange(0, 81, 10))
plt.legend((p1[0], p2[0]), ('Men', 'Women'))

plt.show()

Заранее спасибо!


person Dance Party2    schedule 27.11.2015    source источник
comment
Я добавил ответ, но я не уверен, что это то, что вы имели в виду. Дайте мне знать, если вам нужно что-то еще.   -  person Andras Deak    schedule 27.11.2015
comment
Спасибо, Андрас. Я попробовал это (без дополнительной скобки перед * 2), но получил ошибку: x и y должны иметь одно и то же первое измерение.   -  person Dance Party    schedule 28.11.2015
comment
Я понял, что мне нужно дублировать y, как вы упомянули, и все прошло хорошо.   -  person Dance Party    schedule 28.11.2015
comment
Так что, если это действительно то, что вам нужно, рассмотрите возможность пометить мой ответ как принятый :)   -  person Andras Deak    schedule 28.11.2015


Ответы (1)


Вы можете использовать явно определенный параметр width графика bar, чтобы вручную нарисовать линию, которая соответствует вашим потребностям:

p1 = plt.bar(ind, menMeans, width, color='r', yerr=menStd)
p2 = plt.bar(ind, womenMeans, width, color='y',
         bottom=menMeans, yerr=womenStd)

#line with adjusted length
plt.plot([min(ind), max(ind)+width], np.average(menMeans)]*2,linewidth=1,color='b')

Мы просто определяем пару координат x и y, чтобы сгенерировать линию как plot. x задается [min(ind), max(ind)+width], а y является повторяющимся вектором со значениями np.average(menMeans). Правильные значения x можно вывести из того факта, что код вашего примера помещает xticks в ind+width/2, и мы знаем, что ширина столбцов точно равна width.

Результат:

гистограмма с скорректированной горизонтальной линией

person Andras Deak    schedule 27.11.2015