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

使用groupby分组后绘制多组合折线图遇阻,求解决方案

解决按多分组组合绘制折线图的问题

嘿,这问题我熟!你其实已经走对了关键一步——用groupby(['Project', 'Amount', 'Length'])完成分组,遍历得到的元组里,第二个元素就是对应分组的完整DataFrame,完全不用额外转换,直接就能拿来绘图。我给你两种实用的实现方案:

方案1:每个分组单独生成一张折线图

适合分组数量不多,需要单独查看每个组合细节的场景:

首先确保你的Date列是datetime类型(不然X轴顺序会乱),然后遍历分组绘图:

import pandas as pd
import matplotlib.pyplot as plt

# 先把Date列转成datetime类型(如果还没转的话)
df['Date'] = pd.to_datetime(df['Date'])

# 按指定字段分组
grp = df.groupby(['Project', 'Amount', 'Length'])

# 遍历每个分组
for (project, amount, length), sub_df in grp:
    # 创建新画布
    plt.figure(figsize=(10, 6))
    # 按Subject分组,每个Subject画一条折线
    sub_df.groupby('Subject').plot(x='Date', y='Value', ax=plt.gca(), legend=True)
    # 设置图表标题和标签
    plt.title(f'Project: {project} | Amount: {amount} | Length: {length}')
    plt.xlabel('Date')
    plt.ylabel('Value')
    plt.legend(title='Subject')
    plt.tight_layout()
    plt.show()

代码解释:

  • 遍历grp时,我们用(project, amount, length)拆包分组键(因为是三个字段的组合,所以是三元组),sub_df就是这个分组对应的所有数据,直接是DataFrame格式。
  • 用sub_df.groupby('Subject').plot()自动给每个Subject生成一条折线,ax=plt.gca()指定把所有线画在当前画布上。

方案2:所有分组放在同一张画布的子图里

适合分组数量较多,需要对比查看的场景:

import pandas as pd
import matplotlib.pyplot as plt
import math

# 同样先处理日期列
df['Date'] = pd.to_datetime(df['Date'])

grp = df.groupby(['Project', 'Amount', 'Length'])
num_groups = len(grp)

# 计算子图的行列数(这里设每行3个图,可根据需求调整)
cols = 3
rows = math.ceil(num_groups / cols)

# 创建画布和子图数组
fig, axes = plt.subplots(rows, cols, figsize=(15, 5*rows))
# 把二维的子图数组转成一维,方便遍历
axes = axes.flatten()

# 遍历分组并绘图
for idx, ((project, amount, length), sub_df) in enumerate(grp):
    ax = axes[idx]
    sub_df.groupby('Subject').plot(x='Date', y='Value', ax=ax, legend=True)
    ax.set_title(f'Project: {project}\nAmount: {amount} | Length: {length}')
    ax.set_xlabel('Date')
    ax.set_ylabel('Value')
    ax.legend(title='Subject')

# 隐藏多余的空白子图
for ax in axes[num_groups:]:
    ax.axis('off')

plt.tight_layout()
plt.show()

关键提示:

  • 如果你的Date列原本是字符串格式,一定要先转成datetime,否则折线图的X轴会按字符串排序,时间顺序会混乱。
  • 你也可以用seaborn.lineplot来实现,比如在每个分组里用sns.lineplot(data=sub_df, x='Date', y='Value', hue='Subject', ax=ax),效果更美观,代码也更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:27:27