2016-09-29 8 views
1

グループ化された棒グラフが必要ですが、デフォルトのプロットにはグループ化がありません。pandasデータフレームの棒グラフのグループ化並べ替え

データフレームは、次のようになります。

 
    user year cat1 cat2 cat3 cat4 cat5 
0 Brad 2014 309 186 119 702 73 
1 Brad 2015 280 177 100 625 75 
2 Brad 2016 306 148 127 671 74 
3 Brian 2014 298 182 131 702 73 
4 Brian 2015 295 125 117 607 76 
5 Brian 2016 298 137 97 596 75 
6 Chris 2014 309 171 111 654 72 
7 Chris 2015 251 146 105 559 76 
8 Chris 2016 231 130 105 526 75 
etc 

は他の場所で、コードは、2つの変数、user1とuser2のを生成します。私は、cat1、cat2、およびcat3の時間をかけてそれらの2人のユーザーの数を比較する棒グラフを作成したいと思います。審美的なノートで

grouped bar chart

:私は年のラベルは縦書きフォントも好むので、例えばuser1とuser2がブライアンとクリスは、私は次のようになりますチャートを望むだったらサイズは1行に収まりますが、現時点で私を混乱させるのは実際にはデータフレームのピボットです。

+0

あなたは、バーは次のようにグループ分けすることにしますか。あなたはそれらを代替グループにしたいと思っていますか? –

+0

上記は私の理想です(年ラベルの醜い紛争を除いて)。 –

答えて

1

プロットしたいユーザーのサブセットを選択します。 pivot_tableを使用して、DFを必要な形式に変換し、それを転置および積み重ねてプロットします。

import matplotlib.pyplot as plt 

def select_user_plot(user_1, user_2, cats, frame, idx, col): 
    frame = frame[(frame[idx[0]] == user_1)|(frame[idx[0]] == user_2)] 
    frame_pivot = frame.pivot_table(index=idx, columns=col, values=cats).T.unstack() 
    frame_pivot.plot.bar(legend=True, cmap=plt.get_cmap('RdYlGn'), figsize=(8,8), rot=0) 

最後に、

はバープロットに含まれるユーザーやカテゴリを選択してください。

user_1 = 'Brian' 
user_2 = 'Chris' 
cats = ['cat1', 'cat2', 'cat3'] 

select_user_plot(user_1, user_2, cats, frame=df, idx=['user'], col=['year']) 

Image

注:これはOPが投稿したことが、プロットに近い与えます(年が代わりに目盛りラベルの伝説のように見える)

+1

ありがとうございました。ピボットとアンスタックで物事がすべて捻れていた。私は助けに感謝します。 –

+0

同じです。私はしばらくそれを完全に把握するためにしました。 –

関連する問題