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

Pandas按ID分组绘制多幅子图 每幅按end_cutoff绘制多条折线

代码修正方案

你当前代码的核心问题是仅创建了1个全局轴对象,所有折线都绘制在同一个轴上,没有为不同ID创建独立的绘图载体。

以下是两种符合需求的实现方案:


方案1:同一张画布内拆分多个子图

适合放在同一张视图中对比不同ID的趋势:

import pandas as pd
import matplotlib.pyplot as plt

# 先转换日期列格式,避免X轴显示异常
df_fit['date_x'] = pd.to_datetime(df_fit['date_x'])
df_fit['end_cutoff'] = pd.to_datetime(df_fit['end_cutoff'])

# 统计唯一ID数量,生成对应数量的子图(这里用2行1列布局,可自行调整为1行2列)
unique_ids = df_fit['ID'].unique()
fig, axes = plt.subplots(nrows=len(unique_ids), ncols=1, figsize=(8, 6*len(unique_ids)))

# 遍历每个ID对应子图
for idx, current_id in enumerate(unique_ids):
    id_data = df_fit[df_fit['ID'] == current_id]
    current_ax = axes[idx]
    # 每个end_cutoff绘制一条折线
    for cutoff, group in id_data.groupby('end_cutoff'):
        current_ax.plot(group['date_x'], group['value_y'], label=f"截止日期{cutoff.date()}")
    # 子图配置
    current_ax.set_title(f"ID {current_id} 数值变化趋势")
    current_ax.set_xlabel("日期")
    current_ax.set_ylabel("value_y数值")
    current_ax.legend()

plt.tight_layout()
plt.show()

方案2:每个ID生成完全独立的绘图窗口

适合需要单独导出、单独查看每个ID绘图的场景:

import pandas as pd
import matplotlib.pyplot as plt

df_fit['date_x'] = pd.to_datetime(df_fit['date_x'])
df_fit['end_cutoff'] = pd.to_datetime(df_fit['end_cutoff'])

unique_ids = df_fit['ID'].unique()
for current_id in unique_ids:
    # 每次循环新建独立画布
    fig, ax = plt.subplots(figsize=(8,6))
    id_data = df_fit[df_fit['ID'] == current_id]
    for cutoff, group in id_data.groupby('end_cutoff'):
        ax.plot(group['date_x'], group['value_y'], label=f"截止日期{cutoff.date()}")
    ax.set_title(f"ID {current_id} 数值变化趋势")
    ax.set_xlabel("日期")
    ax.set_ylabel("value_y数值")
    ax.legend()
    plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 02:45:02