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

问题描述

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

import pandas as pd

d = {'Month': ['Jan','Jan','Feb','Mar','Mar'],'Amount': [5,65,29,200,28.5,12,4,100,21],'Category': ['Travel','Food','Dentist','Travel','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 一次完成相同的聚合和整形。从您的初始数据帧:

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

enter image description here


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

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

import seaborn as sns
sns.set()

df_pivot = pd.pivot_table(df,aggfunc='sum')
df_pivot.plot.bar(stacked=True)

enter image description here