如何将Pandas绘制的三个年度1月时间序列图合并为一个图
解决方法:合并多年度同月份时间序列折线图到单个画布
一、数据预处理(关键步骤)
先确保日期列解析为datetime类型,精准筛选目标数据,并为绘图准备对齐的X轴字段:
import pandas as pd import matplotlib.pyplot as plt # 读取CSV,解析日期列(替换成你的日期列名) df = pd.read_csv('your_data.csv', parse_dates=['date']) # 筛选目标公司+2020-2022年1月的数据 target_company = '你的目标公司名称' filtered_df = df[ (df['company'] == target_company) & (df['date'].dt.month == 1) & (df['date'].dt.year.isin([2020, 2021, 2022])) ].copy() # 生成月-日字段(让三年的日期点在X轴对齐),年份转为字符串用于区分线条 filtered_df['month_day'] = filtered_df['date'].dt.strftime('%m-%d') filtered_df['year'] = filtered_df['date'].dt.year.astype(str)
二、两种合并绘图的实现方式
方式1:Matplotlib画布+Pandas分组绘图(灵活可控)
核心是指定同一个ax对象,避免Pandas自动创建新画布:
# 创建单个画布和轴对象 fig, ax = plt.subplots(figsize=(10, 6)) # 按年份分组,循环绘制每条折线到同一个ax上 for year, group_data in filtered_df.groupby('year'): group_data.plot( x='month_day', y='你的数值列名称', # 替换成实际的数值列,比如'营收'/'股价' ax=ax, label=f'{year}年1月', marker='o' # 添加标记点更易区分数据点 ) # 调整图表样式 ax.set_title('目标公司2020-2022年1月趋势对比') ax.set_xlabel('日期(月-日)') ax.set_ylabel('指标数值') ax.legend() plt.xticks(rotation=45) # 旋转X轴标签防止重叠 plt.tight_layout() # 自动适配布局,避免标签被截断 # 显示图表 plt.show()
方式2:透视表+Pandas一键绘图(简洁高效)
先把数据转成透视表,让年份成为列,直接调用plot即可自动合并到同一画布:
# 转换为透视表:行=月-日,列=年份,值=目标指标 pivot_df = filtered_df.pivot( index='month_day', columns='year', values='你的数值列名称' ) # 直接绘图,默认会把所有列画在同一个画布 pivot_df.plot(figsize=(10, 6), marker='o') plt.title('目标公司2020-2022年1月趋势对比') plt.xlabel('日期(月-日)') plt.ylabel('指标数值') plt.xticks(rotation=45) plt.tight_layout() plt.show()
三、常见问题排查
- 生成三个独立图:原因是每次调用
df.plot()时没有指定ax参数,Pandas会自动创建新画布。必须将所有绘图绑定到同一个ax对象上。 - 无图显示:检查两点:① 是否调用了
plt.show();② 筛选后的filtered_df是否为空(确认公司名称、日期范围是否正确)。 - X轴日期不对齐:直接用原始日期会导致三年的日期点分散,通过
dt.strftime('%m-%d')提取月-日,能让同日期的点在X轴重合,对比更直观。
内容的提问来源于stack exchange,提问作者olividir
相关产品推荐
相关产品推荐

