2016-06-23 160 views
0

我有一個數據集,客戶端回答一個問題,客戶端屬於某個類別。該類別是序號。我想將百分比的變化視爲一個比例疊加的barplot。下面是一些測試數據:繪製比例數據python(堆積barplot)

answer | categ 
1  1 
2  1 
3  2 
1  2 
2  3 
3  3 
1  1 
2  1 
3  2 
1  2 
2  3 
3  3 
1  3 
2  2 
3  1 

這裏是你如何生成它:

pd.DataFrame({'answer':[1,2,3]*5, 'categ':[1,1,2,2,3,3]*2+[3,2,1]}) 

使用這大概可以寫更漂亮,更高效的我得到的答案中的百分比一些令人費解的代碼。

test = pd.DataFrame({'answer':[1,2,3]*5, 'categ':[1,1,2,2,3,3]*2+[3,2,1]}) 
rel_data = pd.merge(pd.DataFrame(test.groupby(['answer','categ']).size()).reset_index(),pd.DataFrame(test.groupby('answer').size()).reset_index(), how='left', on='answer') 
rel_data.columns = ['answer', 'categ', 'number_combination', 'number_answer'] 
rel_data['perc'] = rel_data['number_combination']/rel_data['number_answer'] 
rel_data[['answer', 'categ', 'perc']] 

這導致:

answer | categ | perc 
1  1  0.4 
1  2  0.4 
1  3  0.2 
2  1  0.4 
2  2  0.2 
2  3  0.4 
3  1  0.2 
3  2  0.4 
3  3  0.4 

我如何得到這個了多層條形圖,每回答每個類別酒吧和有色領域?

回答

0

這絕不是完美的,但它是一個開始:

for i in set(df.categ): 
    colors = ["r", "g", "b", "y", "o"] #etc.... 
    if i == 1: 
     x = np.zeros(len(set(df.answer))) 
    else: 
     x += df[df.categ == i - 1].perc.as_matrix() 

    plt.bar(df[df.categ == i].answer, df[df.categ == i].perc, bottom=x, color=colors[i - 1]) 

plt.xticks(list(set(df.answer))) 
plt.show() 

的方法是組首先將數據按類別,然後我們可以遍歷每個類別獲得答案這將是單個酒吧。然後我們檢查第一次迭代是否由i == 1檢查。這將創建一個空數組,這將在堆疊時使用。然後我們畫第一個酒吧。然後我們迭代並添加條的高度,因爲我們進入變量x。

顏色數組在那裏,所以你可以區分酒吧好一點。

希望這會有所幫助。

2

一旦我有最後一個數據幀,我可以很容易地得到它。通過這樣做:

rel_data = rel_data.groupby(['answer','categ']).\ 
    perc.sum().unstack().plot(kind='bar', stacked=True, ylim=(0,1)) 

它又髒,但至少它完成了工作。 perc.sum將它變成每個組的一個值(即使它已經是這樣),unstack()將它變成一個DF,其中類別爲列,答案爲行,該圖將其變成比例堆疊的條形圖。 ylim是由於一些微小的舍入誤差,它可以加起來達到1.00001,並增加了一個全新的記號。

+0

夥計,這是一個壞蛋一個班輪! –