web-dev-qa-db-ja.com

色相ごとに積み上げ棒でプロットを数える

私は「色相」に従って積み重ねられた棒でカウントプロットを描画する効率的な方法を探しています。標準の色相の動作は、2番目の列の値に従ってカウントを平行棒に分割することです。私が探しているのは、合計をすばやく比較するために色相棒を積み重ねる効率的な方法です。

タイタニックデータセットの例を使って説明しましょう。

import pandas as pd
import numpy as np
import seaborn as sns
%matplotlib inline

df = sns.load_dataset('titanic')
sns.countplot(x='survived',hue='class',data=df)

countplotとhueで標準のSeaborn動作を提供します Standard Seaborn behavior with countplot and hue

私が探しているのは、色相ごとの積み上げ棒のようなものです Stacked bars per hue

最後の画像を取得するには、次のコードを使用しました

def aggregate(rows,columns,df):
    column_keys = df[columns].unique()
    row_keys = df[rows].unique()

    agg = { key : [ len(df[(df[rows]==value) & (df[columns]==key)]) for value in row_keys]
               for key in column_keys }

    aggdf = pd.DataFrame(agg,index = row_keys)
    aggdf.index.rename(rows,inplace=True)

    return aggdf

aggregate('survived','class',df).plot(kind='bar',stacked=True)

もっと効率的な方法があるはずです。私はseabornがあまりスタックされたバーに対応していないことを知っています...それで、私は自分の関数でデータセットを再配置してmatplotlibを使用しようとしましたが、それを行うためのより賢い方法もあると思います。

どうもありがとうございました!

4
Marcello

barと_stacked=True_でDataFrame.plot()を使用して、基本的に最後の部分でした。

aggregate関数の代わりに、groupby + pivotを使用して必要な機能を実行できます。

_df_plot = df.groupby(['class', 'survived']).size().reset_index().pivot(columns='class', index='survived', values=0)

class     First  Second  Third
survived                      
0            80      97    372
1           136      87    119
_

ここから、_stacked=True_引数を使用してbarとしてプロットできます

_df_plot.plot(kind='bar', stacked=True)
_

enter image description here

6
ALollz