Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Annotate Time Series plot in Matplotlib

I have an index array (x) of dates (datetime objects) and an array of actual values (y: bond prices). Doing (in iPython):

plot(x,y) 

Produces a perfectly fine time series graph with the x axis labeled with the dates. No problem so far. But I want to add text on certain dates. For example, at 2009-10-31 I wish to display the text "Event 1" with an arrow pointing to the y value at that date.

I have read trough the Matplotlib documentation on text() and annotate() to no avail. It only covers standard numbered x-axises, and I can´t infer how to work those examples on my problem.

Thank you

like image 327
luffe Avatar asked Jun 16 '12 22:06

luffe


People also ask

How do I annotate a plot in Matplotlib?

Annotating with Arrow. The annotate() function in the pyplot module (or annotate method of the Axes class) is used to draw an arrow connecting two points on the plot. This annotates a point at xy in the given coordinate ( xycoords ) with the text at xytext given in textcoords .


1 Answers

Matplotlib uses an internal floating point format for dates.

You just need to convert your date to that format (using matplotlib.dates.date2num or matplotlib.dates.datestr2num) and then use annotate as usual.

As a somewhat excessively fancy example:

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

like image 104
Joe Kington Avatar answered Sep 20 '22 21:09

Joe Kington