Подтвердить что ты не робот

График аннотирования временных рядов в Matplotlib

У меня есть индексный массив (x) дат (объектов datetime) и массив фактических значений (y: цены облигаций). Выполнение (в iPython):

plot(x,y)

Создает совершенно прекрасный график временных рядов с осью x, помеченной датами. Пока нет проблем. Но я хочу добавить текст в определенные даты. Например, в 2009-10-31 я хочу отобразить текст "Событие 1" со стрелкой, указывающей на значение y в эту дату.

Я прочитал документацию Matplotlib по text() и annotate() безрезультатно. Он охватывает только стандартные пронумерованные x-оси, и я не могу определить, как работать с этими примерами по моей проблеме.

Спасибо

4b9b3361

Ответ 1

Matplotlib использует внутренний формат с плавающей запятой для дат.

Вам просто нужно преобразовать дату в этот формат (используя 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()

enter image description here