numpy 注解时间序列图

u4vypkhs  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(398)

我有一个日期(datetime对象)的索引数组(x)和一个实际值数组(y:债券价格)。执行以下操作:

plot(x,y)

生成一个完美的时间序列图,x轴标有日期。到目前为止没有问题。但我想在某些日期添加文本。例如,在2009-10-31,我希望显示文本“事件1”,其中箭头指向该日期的 y 值。
我已经阅读了Matplotlib文档中关于 text()annotate() 的内容,但没有任何结果。

bzzcjhmw

bzzcjhmw1#

Matplotlib对日期使用内部浮点格式。
您只需要将日期转换为该格式(使用matplotlib.dates.date2nummatplotlib.dates.datestr2num),然后像往常一样使用annotate
举一个有点过于花哨的例子:

import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

x = [dt.datetime(2009, 05, 01), dt.datetime(2010, 06, 01), 
     dt.datetime(2011, 04, 01), dt.datetime(2012, 06, 01)]
y = [1, 3, 2, 5]

fig, ax = plt.subplots()
ax.plot_date(x, y, linestyle='--')

ax.annotate('Test', (mdates.date2num(x[1]), y[1]), xytext=(15, 15), 
            textcoords='offset points', arrowprops=dict(arrowstyle='-|>'))

fig.autofmt_xdate()
plt.show()

lo8azlld

lo8azlld2#

matplotlib的新版本(例如3.7.0)不再需要显式的date2num调用。只需在图上直接传递一个点,作为xy=annotate()

from datetime import datetime
import matplotlib.pyplot as plt

x = [datetime(2009, 5, 1), datetime(2010, 6, 1), 
     datetime(2011, 4, 1), datetime(2012, 6, 1)]
y = [1, 3, 2, 5]

fig, ax = plt.subplots(facecolor='white')
ax.plot(x, y, linestyle='--')

ax.annotate('Test', xy=(x[1], y[1]),   # <---- directly pass the point position
            xytext=(-15, 15), textcoords='offset points', 
            arrowprops={'arrowstyle': '->'})

fig.autofmt_xdate()

一个更简洁(但不太灵活)的解决方案是使用text()进行注解。同样,不需要执行日期时间到数字的转换;就这样过了这一关

plt.plot(x, y, linestyle='--')
plt.text(x[1], y[1], 'Test')        # use x-y coordinate values as is
plt.xticks(plt.xticks()[0][::2]);

相关问题