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
相关产品推荐
相关产品推荐

