Pandas按name分组绘制时间序列折线图 自定义标题并自动保存
实现方法
不要直接用groupby接plot的批量调用逻辑,手动遍历分组对象逐个绘图即可,这种方式可以完全控制单张图表的所有属性,也能按分组名单独保存文件。
具体实现步骤
- 先预处理时间字段,确保
date列为datetime格式,避免x轴时间显示错乱 - 遍历
df.groupby('name')返回的(分组名、分组子集)元组,每个分组单独创建画布绘图 - 绘图完成后直接用当前分组名设置标题、拼接保存文件名即可
参考代码
import pandas as pd import matplotlib.pyplot as plt # 预处理时间字段 df['date'] = pd.to_datetime(df['date']) # 遍历每个分组绘图 for name, sub_df in df.groupby('name'): # 创建画布和轴对象,设置图表尺寸 fig, ax = plt.subplots(figsize=(24, 12)) # 分别绘制A、B指标的时间折线 ax.plot(sub_df['date'], sub_df['A'], label='A指标', linewidth=2) ax.plot(sub_df['date'], sub_df['B'], label='B指标', linewidth=2) # 自定义图表标题、图例,旋转x轴标签避免重叠 ax.set_title(f'分组 {name} 的A、B指标时间变化趋势', fontsize=18) ax.legend(fontsize=14) plt.xticks(rotation=45) ax.grid(alpha=0.3) # 按分组名保存图片,tight参数避免标签被截断 plt.savefig(f'{name}.png', bbox_inches='tight') # 关闭当前画布释放内存,避免多图重叠 plt.close()
扩展说明
如果需要把A、B两个指标拆成上下两个独立子图展示,只需要修改画布创建逻辑即可,示例:
# 创建2行1列的子图布局 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(24, 16)) # 第一个子图画A指标 ax1.plot(sub_df['date'], sub_df['A'], color='#1f77b4', label='A指标') ax1.set_title(f'分组 {name} A指标变化趋势', fontsize=16) ax1.legend() # 第二个子图画B指标 ax2.plot(sub_df['date'], sub_df['B'], color='#ff7f0e', label='B指标') ax2.set_title(f'分组 {name} B指标变化趋势', fontsize=16) ax2.legend()
原来的df.groupby('name').plot()方法是pandas内部自动批量生成画布,没有暴露循环过程中的分组名参数入口,所以没法直接绑定分组信息设置标题和保存文件名,手动遍历分组的方式灵活度最高,所有图表样式都可以按需自定义。
内容的提问来源于stack exchange,提问作者Ayat Al Bahadli
相关产品推荐
相关产品推荐

