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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:06:07