You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更简便地按年份与类型分组绘制收入分布条形图?

问题描述

给定如下DataFrame:

data = [[2008, 'A', 12.2], [2008, 'A', 11.3], [2009, 'A', 4.2], [2010, 'A', 3.4], [2011, 'A', 14.2],
        [2008, 'B', 4.1], [2008, 'B', 17.2], [2009, 'B', 12.2], [2008, 'C', 12.2], [2011, 'C', 12.2]]
  
df = pd.DataFrame(data, columns=['year', 'type', 'income'])

需求是按year和type分组,为每个type类别绘制按年份划分的income求和后的条形图。当前已通过循环透视表实现,但希望有更简便的实现方式。


解决方案

方法一:Seaborn分面绘图(最简洁)

先完成数据聚合,再利用Seaborn的分面功能自动生成所有子图,无需手动循环:

import seaborn as sns
import matplotlib.pyplot as plt

# 按year和type聚合求和
aggregated_df = df.groupby(['year', 'type'], as_index=False)['income'].sum()

# 分面绘制条形图
g = sns.catplot(
    data=aggregated_df,
    x='year',
    y='income',
    col='type',  # 按type拆分子图
    kind='bar',
    col_wrap=1,  # 控制子图排列为1列,可根据需求调整为2/3列
    sharex=False,  # 每个子图只显示自身存在的年份,避免空值
    sharey=True
)

plt.tight_layout()
plt.show()

方法二:Pandas Unstack + 子图绘制

通过groupby聚合后用unstack重塑数据,再一次性生成所有子图:

import pandas as pd
import matplotlib.pyplot as plt

# 聚合并将type转为列
aggregated_df = df.groupby(['year', 'type'])['income'].sum().unstack()

# 为每个type生成单独的条形图
aggregated_df.plot(
    kind='bar',
    subplots=True,  # 每列对应一个子图
    layout=(1, 3),  # 子图排列为1行3列
    figsize=(12, 4),
    title=['Type A', 'Type B', 'Type C']
)

plt.tight_layout()
plt.show()

方法三:简化原循环逻辑

如果偏好原生Pandas绘图,可以去掉冗余的透视表操作,直接分组求和后绘图:

import matplotlib.pyplot as plt

for t in df['type'].unique():
    # 筛选对应type后,按year求和并绘图
    df.loc[df['type'] == t].groupby('year')['income'].sum().plot(
        kind='bar',
        title=f'Income Distribution - Type {t}'
    )
    plt.show()

内容的提问来源于stack exchange,提问作者Viktor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:30:52