My data is stored as a pandas dataframe. I have created a chart of date (object format) vs. percentile (int64 format) using the plot_date() function in matplotlib and would like to add some vertical lines at pre-specified dates.
I have managed to add point markers at the pre-specified dates, but can't seem to find a way to make them into vertical lines.
I've found various answers on SO/SE about how to add vertical lines to a plot(), but am having trouble converting my data to a format that can be used by plot(), hence why I have used plot_date().
Sample data:
date percentile
2012-05-30 3
2014-11-25 60
2012-06-15 38
2013-07-18 16
My code to plot the chart is as below:
x_data = data["date"]
y_data = data["percentile"]
plt.figure()
plt.plot()
#create a scatter chart of dates vs. percentile
plt.plot_date(x = x_data, y = y_data)
#now add a marker at prespecified dates - ideally this would be a vertical line
plt.plot_date(x = '2012-09-21', y = 0)
plt.savefig("percentile_plot.png")
plt.close()
Unfortunately I can't provide an image of the current output as the code is on a terminal with no web access.
Any help is greatly appreciated - also in terms of how I've asked the question as I am quite new to SO / SE.
Thank you.
2 Answers
In MatPlotLib 1.4.3 this works:
import datetime as dt
plt.axvline(dt.datetime(2012, 9, 21))
Passing a string-style date (2012-09-21) doesn't work because MPL doesn't know this is a date. Whatever code you are using to load your file is probably implicitly creating datetime objects out of your strings, which is why the plot call works.
Also, in MPL 1.4.3, I did not need to call plt.plot_date(data['date'], ...), simply calling plt.plot(data['date'], ...) worked for me as long as the data['date'] column is a column of datetime objects.
Good luck.
Use pandas. Here is an example, also converting to timestamps just in case:
df = pd.DataFrame({
'date':[
'2012-05-30',
'2014-11-25',
'2012-06-15',
'2013-07-18',
],
'percentile':[3,60,38,16]
})
df['date'] = df['date'].apply(pd.Timestamp)
df=df.set_index('date')
df.plot(marker='o')
plt.axvline(pd.Timestamp('2013-09-21'),color='r')
Here is the output: