Search code examples
pythonnumpymatplotlibtime-seriesannotations

Annotate Time Series plot


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

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, on 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 through the Matplotlib documentation on text() and annotate() to no avail.


Solution

  • 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