使用数字数据作为色调的 seaborn 中的堆叠条形图

Stacked barplot in seaborn using numeric data as hue

我有一个简单的 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)

我想创建一个 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')

但是这个方法在尝试使用seaborn时报错,而且看起来没必要复杂。

有没有更好的方法达到预期的效果?

你的初始方法很复杂,因为你有不必要的步骤。您 groupbypivot,但可以使用 pivot_table 立即完成相同的聚合和重塑。来自您的初始 DataFrame:

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


至于使用seaborn,我不会。他们并不真正支持堆叠的条形图,并且他们的所有示例 look like stacked plots 只有两个类别,他们在其中绘制总数,然后覆盖一组(给人以堆叠的印象)。但是这种方法不容易扩展到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)