Python循环绘制多客户独立折线图的代码修复方案
代码失效核心原因
现有代码无法生成70张独立折线图,由以下问题导致:
- 循环绘图前未创建新画布,所有客户的折线会默认绘制在同一张画布上形成叠加
- 绘图时y轴传入的是未重置索引的分组聚合Series,与x轴传入的时间列索引不匹配,易出现绘图错位
- 单张图绘制完成后未执行画布清空、显示或保存操作,后续循环的绘图内容会持续叠加在当前画布
- 循环遍历客户列表时使用了
client_list[:60]切片,仅会处理前60个客户,无法覆盖全部70个客户
修复后可直接运行代码
先确保导入所需依赖,再执行循环逻辑:
import pandas as pd import matplotlib.pyplot as plt # 中文环境下可添加以下两行解决中文显示乱码问题,纯英文环境可删除 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 提前统一转换时间字段格式,避免循环内重复转换 new_df['time_window_end'] = pd.to_datetime(new_df['time_window_end']) # 取全量客户列表,去掉[:60]切片限制 client_list = new_df['client_name'].unique().tolist() for client in client_list: # 为当前客户创建独立画布,可根据需求修改figsize调整图表尺寸 plt.figure(figsize=(10, 6)) # 筛选当前客户的数据,按天维度聚合标签值 client_subset = new_df[new_df['client_name'] == client] # 如果要统计每日记录条数把.sum()换成.count()即可 daily_tag = client_subset.groupby(client_subset['time_window_end'].dt.floor('d'))['tag_count'].sum().reset_index() # 绘制折线 plt.plot(daily_tag['time_window_end'], daily_tag['tag_count'], marker='o', linewidth=2) # 添加图表标注 plt.title(f'客户{client}每日标签数量变化', fontsize=14) plt.xlabel('统计日期', fontsize=12) plt.ylabel('标签总量', fontsize=12) # 旋转x轴日期标签避免重叠 plt.xticks(rotation=45) # 自动调整布局防止标签截断 plt.tight_layout() # 两种输出方式二选一即可 # 1. 保存图片到本地,文件名自动关联客户名不会覆盖 plt.savefig(f'./客户_{client}_标签趋势.png', dpi=150) # 2. 直接弹窗显示图表 # plt.show() # 清空当前画布,避免下一轮循环绘图叠加 plt.close()
可选调整说明
- 若你原本的统计需求是计算每个日期的记录条数而非标签值总和,把聚合逻辑里的
.sum()替换为.count()即可 - 折线颜色、样式、标记点形状、画布尺寸都可以通过修改
plt.plot()、plt.figure()的参数自定义 - 保存的图片默认存在Python脚本的运行同级目录,可自行修改
plt.savefig()里的路径调整存储位置
内容的提问来源于stack exchange,提问作者KIMIA Ghassemzadeh
相关产品推荐
相关产品推荐

