Seaborn 中使用数字数据作为色调的堆积条形图

Fas*_*eno 1 python dataframe pandas stacked-chart seaborn

我有一个简单的 pandas 数据框,包含 3 列(月份、金额、类别),其中每行代表特定类别的费用:

import pandas as pd

d = {'Month': ['Jan', 'Jan', 'Jan', 'Feb', 'Feb', 'Mar', 'Mar', 'Mar', 'Mar'], 'Amount': [5, 65, 29, 200, 28.5, 12, 4, 100, 21], 'Category': ['Travel', 'Food', 'Dentist', 'Dentist', 'Food', 'Travel', 'Food', 'Sport', 'Sport']}
df = pd.DataFrame(df)
Run Code Online (Sandbox Code Playgroud)

我想创建一个seaborn条形图,其中每个条形代表每月的支出总额,每个条形都分为不同的颜色,其中每种色调代表该月特定类别的总支出。

我能够使用相当复杂的方法并使用 matplotlib 进行绘图来实现结果:

df = df.groupby(['Month', 'Category']).sum()   
df.reset_index(inplace=True)
pivot_df = df.pivot(index='Month', columns='Category', values='Amount')
df.plot.bar(stacked=True, colormap='tab20')
Run Code Online (Sandbox Code Playgroud)

但这种方法在尝试使用seaborn时会出错,而且似乎没有必要复杂。

有没有更好的方法来达到想要的结果?

ALo*_*llz 5

您最初的方法很复杂,因为有不必要的步骤。您groupbypivot,但是可以使用 立即完成相同的聚合和重塑pivot_table。从您的初始数据帧:

df_pivot = pd.pivot_table(df, index='Month', columns='Category', values='Amount', aggfunc='sum')
df_pivot.plot.bar(stacked=True, colormap='tab20')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


至于使用seaborn,我不会。他们并不真正支持堆叠条形图,并且所有看起来像堆叠图的示例都只有两个类别,它们绘制总数,然后覆盖一组(给人堆叠的印象)。但这种方法不容易扩展到 2 个以上的组。

但如果你想要seaborn 的感觉,你可以使用它们的默认值。

import seaborn as sns
sns.set()

df_pivot = pd.pivot_table(df, index='Month', columns='Category', values='Amount', aggfunc='sum')
df_pivot.plot.bar(stacked=True)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述