2016-06-23 12 views
0

クライアントが質問に答え、クライアントが特定のカテゴリに属しているデータセットがあります。カテゴリは順序です。私は比例積み重ね棒グラフとして変化率を視覚化したい。ここではいくつかのテストデータは次のとおりです。比例データのプロット(積み重ね棒グラフ)

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はそれをグループごとに1つの値に変えます(既にそれがあったとしても)、unstack()はカテゴリを列として、答えを行としてDFに変換し、プロットはこれを比例積み重ね棒グラフに変換します。 ylimはいくつかの小さな丸め誤差が原因で、1.00001まで追加され、全く新しいダニを加えました。

+0

これは悪い一ライナーだよ! –

関連する問題