如何更简便地按年份与类型分组绘制收入分布条形图?
问题描述
给定如下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
相关产品推荐
相关产品推荐

