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时会出错,而且似乎没有必要复杂。
有没有更好的方法来达到想要的结果?
您最初的方法很复杂,因为有不必要的步骤。您groupby和pivot,但是可以使用 立即完成相同的聚合和重塑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)
| 归档时间: |
|
| 查看次数: |
3514 次 |
| 最近记录: |