web-dev-qa-db-ja.com

Seabornを使ってファセットグリッドスタックバープロットを作成する方法

私は積み重ねられた棒グラフを内側に積み上げ棒グラフでプロットしようとしています。

私は海箱を使いたいです。そのBarplot関数は積み重ねられた引数を含まない。

カスタムの呼び出し可能関数でfacetgrid.mapを使用しようとしました。

import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

def custom_stacked_barplot(col_day, col_time, col_total_bill, **kwargs):
    dict_df={}
    dict_df['day']=col_day
    dict_df['time']=col_time
    dict_df['total_bill']=col_total_bill
    df_data_graph=pd.DataFrame(dict_df)
    df = pd.crosstab(index=df_data_graph['time'], columns=tips['day'], values=tips['total_bill'], aggfunc=sum)
    df.plot.bar(stacked=True)

tips=sns.load_dataset("tips")
g = sns.FacetGrid(tips, col='size',  row='smoker')
g = g.map(custom_stacked_barplot, "day", 'time', 'total_bill')
 _

ただし、空のキャンバスと積み上げ棒グラフが別々に入手できます。

空のキャンバス:

enter image description here

グラフ1アパート:

enter image description here

グラフ2 :.

enter image description here

この問題を解決できますか?助けてくれてありがとう!

6
rod41

API(pandas.DataFrame.plot)の異なるミックスが表示されないように見えます(seaborn.FacetGrid)。積み重ねられた棒プロットはSeabornプロットではサポートされていないので、MatplotLib subplotsgroupbyレベルで繰り返して、独自のバージョンを開発することを検討してください。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

def custom_stacked_barplot(t, sub_df, ax):
    plot_df = pd.crosstab(index=sub_df["time"], columns=sub_df['day'], 
                           values=sub_df['total_bill'], aggfunc=sum)

    p = plot_df.plot(kind="bar", stacked=True, ax = ax, 
                     title = " | ".join([str(i) for i in t]))   
    return p

tips = sns.load_dataset("tips")
g_dfs = tips.groupby(["smoker", "size"])

# INITIALIZE PLOT
# sns.set()
fig, axes = plt.subplots(nrows=2, ncols=int(len(g_dfs)/2)+1, figsize=(15,6))

# BUILD PLOTS ACROSS LEVELS
for ax, (i,g) in Zip(axes.ravel(), sorted(g_dfs)):
    custom_stacked_barplot(i, g, ax)

plt.tight_layout()
plt.show()
plt.clf()
plt.close()

Plot Output 1

そしてseaborn.setを使用してテーマとパレットを調整します。

Plot Output 2

1
Parfait