在可视化时间序列时标记特定日期

时间:2016-03-10 02:54:03

标签: python pandas matplotlib

我有一个有几年的时间序列'值得的数据,例如:

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))

ts = ts.cumsum()

ts.plot()

我还有两个额外的数组:让我们调用第一个

dates = [pd.datetime("2000-12-01"), pd.datetime("2001-01-03")]

第二个

labels = ["My birthday", "My dad's birthday"]

labels [i]包含date [i]的标签。我想要做的是在时间序列图中显示它们,以便识别它们。一种可能的可视化方法是在x轴上显示日期,从那里开始绘制一条垂直线,并在图例(带颜色编码)或线旁边的某处标记。

最终结果不应与此有太大不同:

ExampleGraph

1 个答案:

答案 0 :(得分:6)

首先在pandas和matplotlib API之间切换会让人感到困惑。

解决方案:获取当前轴,然后使用标准matplotlib API进行注释。这让你开始:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

ts = pd.Series(np.random.randn(1000),
               index=pd.date_range('1/1/2000',
               periods=1000))

ts = ts.cumsum()
ts.plot()

label_list = [
    (pd.to_datetime("2001-05-01"), 'My\nbirthday', 'r'),
    (pd.to_datetime("2001-10-16"), "Dad's\nbirthday", 'b')
]

ax = plt.gca()

for date_point, label, clr in label_list:
    plt.axvline(x=date_point, color=clr)
    plt.text(date_point, ax.get_ylim()[1]-4, label,
             horizontalalignment='center',
             verticalalignment='center',
             color=clr,
             bbox=dict(facecolor='white', alpha=0.9))

plt.show()

这会产生下面的图像,您需要考虑将titlestext labels and their bounding boxes修改为轴对象:

example image