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
相关产品推荐
相关产品推荐

