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

Pandas多时间序列DataFrame绘图问题:股票月收益年份重叠展示失败

解决股票年度月度收益重叠对比绘图问题

我懂你遇到的困扰了——因为每个年份的月度数据用的都是真实年份的日期索引(比如2015-01、2016-01),Matplotlib会按照真实时间轴来排列这些数据,结果它们就沿着X轴分散开了,根本没法重叠对比。下面给你两种简单好用的解决方案:

方法1:统一所有年份的索引年份

核心思路是把所有年份的日期索引替换成同一个固定年份(比如随便选个2000年),这样所有年份的1月都会对应2000-01,2月对应2000-02……绘图时自然就重叠在一起了。

示例代码:

import matplotlib.pyplot as plt
import pandas as pd

# 封装一个处理单年份数据的函数
def process_year_data(series, year_label):
    processed = series.copy()
    # 把索引里的年份替换成固定值(这里用2000)
    processed.index = processed.index.map(lambda x: x.replace(year=2000))
    processed.name = year_label
    return processed

# 处理各年份的数据
processed_2014 = process_year_data(Monthly_Return2014, '2014')
processed_2015 = process_year_data(Monthly_Return2015, '2015')
processed_2016 = process_year_data(Monthly_Return2016, '2016')
processed_2017 = process_year_data(Monthly_Return2017, '2017')

# 绘制重叠折线图
fig, ax = plt.subplots(figsize=(10, 6))
processed_2014.plot(ax=ax)
processed_2015.plot(ax=ax)
processed_2016.plot(ax=ax)
processed_2017.plot(ax=ax)

# 添加图表细节,让结果更清晰
ax.set_title('Annual Monthly Stock Returns Comparison')
ax.set_ylabel('Stock Returns')
ax.set_xlabel('Month')
ax.legend(title='Year')
plt.show()

方法2:合并数据后按月份分组绘图

如果你更习惯用1-12的月份数字当X轴,可以把所有数据合并到一个DataFrame,提取月份信息后用分组绘图的方式实现重叠对比:

示例代码:

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

# 合并所有年份的数据,同时给每组数据加上年份标签
all_returns = pd.concat([
    Monthly_Return2014.assign(Year=2014),
    Monthly_Return2015.assign(Year=2015),
    Monthly_Return2016.assign(Year=2016),
    Monthly_Return2017.assign(Year=2017)
])

# 从索引里提取月份数字(1-12)
all_returns['Month'] = all_returns.index.month

# 用seaborn绘制重叠折线图,自动按年份区分颜色
fig, ax = plt.subplots(figsize=(10, 6))
sns.lineplot(data=all_returns, x='Month', y=all_returns.columns[0], hue='Year', ax=ax)

# 把X轴的数字月份换成更直观的英文缩写
ax.set_xticks(range(1, 13))
ax.set_xticklabels(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 
                    'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])

# 完善图表信息
ax.set_title('Annual Monthly Stock Returns Comparison')
ax.set_ylabel('Stock Returns')
ax.set_xlabel('Month')
plt.show()

两种方法都能实现你想要的年度月度收益重叠对比效果,你可以按需选择:方法1保留了日期格式的X轴,适合习惯看日期索引的场景;方法2的X轴更简洁直观,一眼就能看清月份顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:42:56