如何为pandas DataFrame分组数据绘制各带组名标题的子图
解决方法
首先先修正你的数据中的日期格式问题,你提供的原始日期字符串格式为年-日-月,直接绘图会出现X轴顺序错乱的问题,先做格式转换:
import pandas as pd import matplotlib.pyplot as plt # 你的原始数据 cat = ['games','games','home','home','home','food','food','food','food','food'] dates = ['2024-07-01','2021-31-1', '2021-04-1', '2021-05-1','2021-02-2', '2021-05-1','2021-01-2','2021-14-2','2021-03-3','2021-11-4'] nums = [137, 338, 52, 144, 100, 5, 72, 400, 100, 99] df = pd.DataFrame({'cat':cat, 'dates':dates, 'nums':nums}) # 转换为标准日期格式 df['dates'] = pd.to_datetime(df['dates'], format='%Y-%d-%m')
方法1:遍历groupby对象手动设置标题(无需额外依赖)
如果需要每个子图单独弹出,直接遍历分组即可:
for cat_name, group_data in df.groupby('cat'): ax = group_data.plot(x='dates', y='nums', kind='line') ax.set_title(cat_name) plt.show()
如果需要将所有子图放在同一张画布上,提前创建子图轴对应分组即可:
# 3个分类对应3行1列的子图布局 fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(8, 10)) for (cat_name, group_data), ax in zip(df.groupby('cat'), axes.flat): group_data.plot(x='dates', y='nums', ax=ax) ax.set_title(cat_name) plt.tight_layout() plt.show()
方法2:用seaborn的FacetGrid实现(代码更简洁)
如果允许引入seaborn库,只需几行代码即可自动完成分组+子图标题设置:
import seaborn as sns g = sns.FacetGrid(df, col='cat', col_wrap=1, height=4) g.map(plt.plot, 'dates', 'nums') g.set_titles('{col_name}') # 直接取分类值作为子图标题 plt.show()
注意:你原代码中
plot(x = 'date')存在参数错误,你的日期列名为dates,需要修正参数避免报错。
内容的提问来源于stack exchange,提问作者formicaman
相关产品推荐
相关产品推荐

