лентова диаграма динамична референтна дължина на линията

Имам референтна линия в стълбовидна диаграма, но искам тази линия да се коригира динамично въз основа на дължината на индекса на оста x. Бих искал линията да започва от левия край на най-лявата лента и да завършва в десния край на най-дясната лента. Забелязах, че когато стойността за ind (индекс) варира, не мога точно да направя корекцията, като използвам процент от 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