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

如何在同一张图中以相同分辨率绘制两年份的时间序列数据?

我明白你遇到的问题了——用pivot的时候不小心把日度的细节给抹平了,确实挺头疼的。别担心,咱们换个思路,不用pivot也能轻松把两年的数据叠在同一张图里,还能完美保留日度分辨率,样式也能完全统一。

方案一:直接在同一绘图对象上分别绘制

这种方法最直接,完全不会丢失任何日度数据的细节。假设你的两个DataFrame分别叫df_2022和df_2023,都包含date(已转为datetime格式的日期列)和value(要可视化的数值列):

import matplotlib.pyplot as plt

# 创建绘图对象,设置画布大小
fig, ax = plt.subplots(figsize=(12, 6))

# 绘制2022年数据,定义统一样式
ax.plot(df_2022['date'], df_2022['value'], color='#1f77b4', linestyle='-', linewidth=1, label='2022')

# 用完全一致的样式绘制2023年数据,仅通过颜色区分
ax.plot(df_2023['date'], df_2023['value'], color='#ff7f0e', linestyle='-', linewidth=1, label='2023')

# 添加图表元素
ax.legend()
ax.set_xlabel('日期')
ax.set_ylabel('数值')
ax.set_title('2022-2023年日度时间序列对比')

# 自动调整x轴日期标签,避免重叠
fig.autofmt_xdate()

plt.show()

这种方式下,每条曲线都是基于原始日度数据直接绘制的,不会有任何平滑或聚合操作,而且你可以精确控制样式,保证两年的数据呈现完全一致的视觉效果。

方案二:合并DataFrame后分组绘制

如果你更习惯先合并数据再绘图,那要避开pivot的坑——不要对日期做聚合,而是保留每条日度数据的独立行,新增年份列来区分:

import pandas as pd
import matplotlib.pyplot as plt

# 给每个DataFrame添加年份标识列
df_2022['year'] = 2022
df_2023['year'] = 2023

# 合并两个DataFrame
combined_df = pd.concat([df_2022, df_2023], ignore_index=True)

# 确保日期列是datetime格式(如果还不是的话)
combined_df['date'] = pd.to_datetime(combined_df['date'])

# 按年份分组绘制
fig, ax = plt.subplots(figsize=(12, 6))
for year, group in combined_df.groupby('year'):
    # 统一线型和线宽,仅用颜色区分年份
    ax.plot(group['date'], group['value'], linestyle='-', linewidth=1, label=str(year))

# 添加图表元素
ax.legend()
ax.set_xlabel('日期')
ax.set_ylabel('数值')
ax.set_title('2022-2023年日度时间序列对比')
fig.autofmt_xdate()

plt.show()

这里的核心是groupby('year')后逐组绘制,每组都是原始的日度数据,自然不会出现平滑丢失细节的问题。

为什么之前的pivot会出问题?

大概率是你在pivot过程中,不小心对日期做了聚合(比如按月份/季度合并),或者pivot后的索引没有保留日度的datetime格式。只要保证每一行对应单独的日度数据,不管是分开绘制还是合并后分组绘制,都能完美保留原始分辨率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:09:43