2017-02-11 3 views
0

Мои данные, как показано ниже:Как добавить метки данных поверх всех баров в поисковых барплотах?

data=io.StringIO("""x1,x2,x3 
    1,A,0.42 
    1,B,0.62 
    2,A,0.24 
    2,B,0.58 
    """) 
df = pd.read_csv(data, sep=",") 

Я пытался сделать Сиборн barplot с ярлыком данных над каждой строке:

ax = sns.barplot (data=df, x='x2', y='x3', hue='x1', 
        palette=sns.xkcd_palette(['blue', 'red'])) 
ax.legend(loc='center right', bbox_to_anchor=(1.03, 0.9), 
      ncol=1, fancybox=True, shadow=True) 

barwidth = [0.4,0.4] 
ax.set_ylim(0, 0.7) 
label_ = df.x3 
for bar,newwidth, label in zip(ax.patches,barwidth, label_): 
    x = bar.get_x() 
    width = bar.get_width() 
    height = bar.get_height() 

    centre = x+width/2. 
    bar.set_x(centre-newwidth/2.) 
    bar.set_width(newwidth) 

    ax.text(x+width/2., 
      height + 0.03, 
      '{0:4.2f}'.format(label), 
      ha="center") 

Однако, это то, что я получил. Кажется, что морские прогулки обрабатывают бары как два патча вместо 4, по одному для каждой группы. Я не могу найти способ решить проблему. Помощь очень ценится. Заранее спасибо.

enter image description here

ответ

0

Вы только что сделали небольшую ошибку в определении barwidth. Его длина должна быть четыре:

barwidth = [0.4, 0.4, 0.4, 0.4] 

Как вы его теперь, ваш цикл происходит только через две итерации, поскольку она ограничена длиной BarWidth.

+0

Большое вам спасибо! @Майкл – zesla