在单个绘图python上比较多年数据

Tay*_*lor 5 python plot time-series matplotlib pandas

我有两个不同年份的时间序列存储在熊猫数据框中。例如:

data15 = pd.DataFrame(
    [1,2,3,4,5,6,7,8,9,10,11,12],
    index=pd.date_range(start='2015-01',end='2016-01',freq='M'),
    columns=['2015']
)
data16 = pd.DataFrame(
    [5,4,3,2,1],
    index=pd.date_range(start='2016-01',end='2016-06',freq='M'),
    columns=['2016']
)
Run Code Online (Sandbox Code Playgroud)

我实际上正在使用每日数据,但是如果这个问题得到了足够的解答,我可以弄清楚其余的一切。

我想做的是将这些不同数据集的图叠加到从1月到12月的单个图上,以比较不同年份之间的差异。我可以通过为其中一个数据集创建一个“假”索引来做到这一点,以便它们具有共同的年份:

data16.index = data15.index[:len(data16)]
ax = data15.plot()
data16.plot(ax=ax)
Run Code Online (Sandbox Code Playgroud)

但是我想尽可能避免弄乱索引。这种方法的另一个问题是,年份(2015)将出现在我不希望的x轴刻度标签中。有谁知道更好的方法吗?

Oli*_* W. 4

一种方法是在第一个轴上覆盖透明轴,并在其中绘制第二个数据帧,但随后您需要同时更新两个轴的 x 限制(类似于twinx)。然而,我认为这需要更多的工作,并且还有一些缺点:例如,您无法再轻松地以交互方式缩放到特定区域,除非您确保两个轴通过其 x 限制链接。实际上,最简单的方法是通过“弄乱索引”来考虑偏移量。

至于刻度标签,您可以通过指定 x-tick 格式轻松更改格式,使其不显示年份:

import matplotlib.dates as mdates
month_day_fmt = mdates.DateFormatter('%b %d') # "Locale's abbreviated month name. + day of the month"
ax.xaxis.set_major_formatter(month_day_fmt)
Run Code Online (Sandbox Code Playgroud)

查看用于指定日期格式的 matplotlib API 示例