我有一个日期(datetime对象)的索引数组(x)和一个实际值数组(y:债券价格)。执行以下操作:
plot(x,y)
生成一个完美的时间序列图,x轴标有日期。到目前为止没有问题。但我想在某些日期添加文本。例如,在2009-10-31,我希望显示文本“事件1”,其中箭头指向该日期的 y 值。我已经阅读了Matplotlib文档中关于 text() 和 annotate() 的内容,但没有任何结果。
bzzcjhmw1#
Matplotlib对日期使用内部浮点格式。您只需要将日期转换为该格式(使用matplotlib.dates.date2num或matplotlib.dates.datestr2num),然后像往常一样使用annotate。举一个有点过于花哨的例子:
matplotlib.dates.date2num
matplotlib.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()
lo8azlld2#
matplotlib的新版本(例如3.7.0)不再需要显式的date2num调用。只需在图上直接传递一个点,作为xy=到annotate()。
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()进行注解。同样,不需要执行日期时间到数字的转换;就这样过了这一关
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]);
2条答案
按热度按时间bzzcjhmw1#
Matplotlib对日期使用内部浮点格式。
您只需要将日期转换为该格式(使用
matplotlib.dates.date2num
或matplotlib.dates.datestr2num
),然后像往常一样使用annotate
。举一个有点过于花哨的例子:
lo8azlld2#
matplotlib的新版本(例如3.7.0)不再需要显式的
date2num
调用。只需在图上直接传递一个点,作为xy=
到annotate()
。一个更简洁(但不太灵活)的解决方案是使用
text()
进行注解。同样,不需要执行日期时间到数字的转换;就这样过了这一关