2015-12-05 7 views
4

Как правильно дать аннотации к диаграммам Pandas Bar?Pandas, Bar Chart Аннотации

Я следую Bar Chart Annotations with Pandas and MPL, но почему-то я не могу сделать это в своем собственном коде - this is as far as I can go. Что не так?

Я также нашел следующий код from here:

def autolabel(rects): 
    # attach some text labels 
    for rect in rects: 
     height = rect.get_height() 
     ax.text(rect.get_x() + rect.get_width()/2., 1.05*height, 
       '%d' % int(height), 
       ha='center', va='bottom') 

autolabel(rects1) 
autolabel(rects2) 

Но я не как применить это к моему коду либо. Пожалуйста помоги.

UPDATE:

Спасибо @CT Чжу, за ответ. Тем не менее, в своих горизонтальных полосах, вы все еще поместить текст поверх брусков, но мне нужен текст отображаться внутри или вдоль них, как это от моей ссылочной статьи

enter image description here

, где он/говорит,

«Я очень пригоден для горизонтальных гистограмм, так как я действительно думаю, что их легче читать, однако я понимаю, что многие люди предпочтут, чтобы эта диаграмма была реализована на обычной гистограмме. , вот код для этого, вы заметите, что несколько изменений изменились, чтобы создать аннотацию "*

ответ

2

Оказывается, ваша autolabel функция ожидает список patches, sssuming ваш сюжет только те бары в качестве своего patches, мы могли бы сделать:

df = pd.DataFrame({'score':np.random.randn(6), 
        'person':[x*3 for x in list('ABCDEF')]}) 

def autolabel(rects): 
    x_pos = [rect.get_x() + rect.get_width()/2. for rect in rects] 
    y_pos = [rect.get_y() + 1.05*rect.get_height() for rect in rects] 
    #if height constant: hbars, vbars otherwise 
    if (np.diff([plt.getp(item, 'width') for item in rects])==0).all(): 
     scores = [plt.getp(item, 'height') for item in rects] 
    else: 
     scores = [plt.getp(item, 'width') for item in rects] 
    # attach some text labels 
    for rect, x, y, s in zip(rects, x_pos, y_pos, scores): 
     ax.text(x, 
       y, 
       '%s'%s, 
       ha='center', va='bottom') 

ax = df.set_index(['person']).plot(kind='barh', figsize=(10,7), 
       color=['dodgerblue', 'slategray'], fontsize=13) 

ax.set_alpha(0.8) 
ax.set_title("BarH")#,fontsize=18) 
autolabel(ax.patches) 

enter image description here

ax = df.set_index(['person']).plot(kind='bar', figsize=(10,7), 
       color=['dodgerblue', 'slategray'], fontsize=13) 

ax.set_alpha(0.8) 
ax.set_title("Bar")#,fontsize=18) 
autolabel(ax.patches) 

enter image description here

+0

Благодаря! Согласование с вышеупомянутой * Барной диаграммой Аннотации с Pandas и MPL *, 'autolabel' будут отличаться для вертикальных и горизонтальных баров. По-видимому, код, который я скопировал, предназначен для вертикальных баров. Не могли бы вы изменить его на горизонтальные полоски, чтобы текст отображался * внутри * или вдоль панели, а не поверх нее, пожалуйста? Кроме того, почему все значения '0,5'? Мне нужны аннотации с реальным значением 'score'. Спасибо – xpt

+0

См. Edit. Это просто требует определения, является ли сюжет штриховым или штриховым. –

+0

Спасибо @ ЧТ Чжу, за ответ. Я обновил свой OP для дальнейшего объяснения того, что я имел в виду под * «внутри или вдоль панели» *. – xpt