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

Pandas графическое отображение временных рядов, с вертикальными линиями в выбранные даты

Учитывайте это время, совокупное количество изменений в категории Википедии.

In [555]:
cum_edits.head()
Out[555]:
2001-08-31 23:37:28    1
2001-09-01 05:09:28    2
2001-09-18 10:01:17    3
2001-10-27 06:52:45    4
2001-10-27 07:01:45    5
Name: edits, dtype: int64
In [565]:
cum_edits.tail()
Out[565]:
2014-01-29 16:05:15    53254
2014-01-29 16:07:09    53255
2014-01-29 16:11:43    53256
2014-01-29 18:09:44    53257
2014-01-29 18:12:09    53258
Name: edits, dtype: int64

Мне нужно нарисовать это так:

In [567]:

cum_edits.plot()

Out[567]:

<matplotlib.axes.AxesSubplot at 0x1359c810>

cummulative edits

Я хотел бы построить также вертикальные линии после каждого редактирования total_edits/n ; e.g. n=10. Я рассчитываю их легко.

In [568]:

dates

Out[568]:

[Timestamp('2006-06-04 04:46:22', tz=None),
 Timestamp('2007-01-28 23:53:02', tz=None),
 Timestamp('2007-09-16 10:52:02', tz=None),
 Timestamp('2008-04-28 21:20:40', tz=None),
 Timestamp('2009-04-12 22:07:13', tz=None),
 Timestamp('2010-04-09 18:45:37', tz=None),
 Timestamp('2011-03-28 23:38:12', tz=None),
 Timestamp('2012-05-24 13:44:35', tz=None),
 Timestamp('2013-03-05 17:57:29', tz=None),
 Timestamp('2014-01-29 16:05:15', tz=None)]

Обычно можно использовать axvline(), хотя я сталкиваюсь с двумя проблемами. Даже если я вызываю plt.axvline(x=0.5, color='r') только для создания произвольной строки, я не вижу ее поверх графика pandas. Кстати, я использую IPython с %pylab inline. А во-вторых, я не сейчас, как перевести даты в положение x, которые используются в cum_edits.plot(), поскольку перевод невидим для меня. Должен ли я продолжать создавать эти вертикальные линии?

4b9b3361

Ответ 1

Благодаря @TomAugspurger

Решение состоит в том, чтобы вернуть ваши оси, а затем использовать ax.vlines.

ax = cum_edits.plot()
ymin, ymax = ax.get_ylim()
ax.vlines(x=dates, ymin=ymin, ymax=ymax-1, color='r')

Solutions with vlines

Одно из последних искажений заключается в том, что если длина строк ymax длинна, то matplotlib добавляет дополнительное пространство в верхнюю часть моего графика, поэтому я немного уменьшаю длину меньше, чем исходные оси, поэтому вы видите ymax=ymax-1.