75515


グループ× 商品 別に購入数を集計した数表（下記df）があります。

[code]

    df = pd.DataFrame({'Group': ['A', 'B', 'C', 'D', 'E'],
                       '購入数A': [150, 300, 100, 50, 300],
                       '購入数B': [500, 900, 350, 100, 300],
                       '購入数C': [1000, 390, 100, 300, 300],
                       '購入数D': [800, 400, 370, 800, 100],
                       '購入数E': [200, 50, 500, 350, 300]})
    df
    
[/code]

この集計表から、２種のグラフを作成したいと考えています。

  1. グループごとに、商品ごとの購入数を棒グラフで可視化

[![画像の説明をここに入力](https://i.stack.imgur.com/B2oRg.png)](https://i.stack.imgur.com/B2oRg.png)

  2. グループ× 商品 別の購入数

[![画像の説明をここに入力](https://i.stack.imgur.com/SjJZF.png)](https://i.stack.imgur.com/SjJZF.png)

下記のようにseabornを使って描画する方法を試したりしていますが、  
複数列の集計値をひとつのグラフにどのようにまとめて描画できるかがわかりません。

[code]

    a = df.query('Group == "A"')
    sns.barplot(y='購入数A', data=a)
    
[/code]

こちらご存じの方、アドバイスいただけますと幸いです。

* * *

追記（アドバイスいただいた内容をアレンジしたコードです）

[code]

    import matplotlib
    import matplotlib.pyplot as plt
    import pandas as pd
    import seaborn as sns
    
    matplotlib.rc('font', family='MS Gothic')
    
    df = pd.DataFrame({'Group': ['A', 'B', 'C', 'D', 'E'],
                       '購入数A': [150, 300, 100, 50, 300],
                       '購入数B': [500, 900, 350, 100, 300],
                       '購入数C': [1000, 390, 100, 300, 300],
                       '購入数D': [800, 400, 370, 800, 100],
                       '購入数E': [200, 50, 500, 350, 300]})
    display(df)
    
    test = df.melt(id_vars='Group', var_name='購入数')
    display(test)
    
    sns.barplot(x='購入数', y='value', hue='Group',
                data=df.melt(id_vars='Group', var_name='購入数'))
    
    plt.show()
    
[/code]


CC BY-SA 4.0
2021-04-26T07:13:43.420
75509
2021-04-27T04:51:34.820
2021-04-26T10:43:34.120
3060
41758
question
python pandas matplotlib
Pythonでのグラフ作成方法


こちらの記事の応用で出来そうです。  
[How to make a plot with multiple bars using
seaborn](https://stackoverflow.com/q/57046439/9014308)

こんな感じでしょうか。

[code]

    import matplotlib
    import matplotlib.pyplot as plt
    import pandas as pd
    import seaborn as sns
    
    matplotlib.rc('font', family='MS Gothic')
    
    df = pd.DataFrame({'Group': ['A', 'B', 'C', 'D', 'E'],
                       '購入数A': [150, 300, 100, 50, 300],
                       '購入数B': [500, 900, 350, 100, 300],
                       '購入数C': [1000, 390, 100, 300, 300],
                       '購入数D': [800, 400, 370, 800, 100],
                       '購入数E': [200, 50, 500, 350, 300]})
    
    df = df.set_index('Group')
    
    sns.barplot(x='購入数', y='value', hue='Group',
                data=df.reset_index().melt(id_vars='Group', var_name='購入数'))
    
    plt.show()
    
[/code]

タイトルとかラベルとかの細かい調整は、この記事が参考になるかも。

[seabornの細かい見た目調整をあきらめない](https://qiita.com/skotaro/items/7fee4dd35c6d42e0ebae)

* * *

コメントを受けて追記：

参考にした記事で`barplot`の`data`パラメータ指定時に`df.reset_index().melt()`としていたので、それを変更せずに対処しようとして`df
= df.set_index('Group')`を入れましたが、`reset_index()`を使わなければ`set_index()`は不要でした。


CC BY-SA 4.0
2021-04-26T09:25:08.027
75515
2021-04-26T10:58:34.893
2021-04-26T10:58:34.893
26370
26370
75509
answer


そのままだとグラフ化しにくいので, 転置を行い, カラム名を `'Group'`から持ってきます

[code]

    import pandas as pd
    df = pd.DataFrame({'Group': ['A', 'B', 'C', 'D', 'E'],
                       '購入数A': [150, 300, 100, 50, 300],
                       '購入数B': [500, 900, 350, 100, 300],
                       '購入数C': [1000, 390, 100, 300, 300],
                       '購入数D': [800, 400, 370, 800, 100],
                       '購入数E': [200, 50, 500, 350, 300]})
    
    df = df.set_index('Group').T
    
[/code]

あとは DataFrameの plotメソッドで可能です

[code]

    # 日本語フォントの指定
    from matplotlib import rcParams
    rcParams['font.family'] = 'sans-serif'
    rcParams['font.sans-serif'] = ['Takao', 'IPAexGothic', 'IPAPGothic', 'Noto Sans CJK JP']
    
    #df.plot.bar()   # 全部まとめる場合
    df.plot(kind='bar', subplots=True, layout=(2, 3))   # 別々に表示の場合
    
[/code]


CC BY-SA 4.0
2021-04-26T10:36:33.243
75519
2021-04-27T04:51:34.820
2021-04-27T04:51:34.820
43025
43025
75509
answer