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


问题内容

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

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']
)

我实际上是在处理每日数据,但是如果这个问题得到了足够的解答,我可以找出其余的问题。

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

data16.index = data15.index[:len(data16)]
ax = data15.plot()
data16.plot(ax=ax)

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


问题答案:

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

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

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)

看一下用于指定日期格式matplotlib
API示例