itzy
itzy

Reputation: 11755

Formatting of DateTimeIndex in plot pandas

I'm having trouble deciphering the documentation for changing tick frequency and date formatting with pandas.

For example:

import numpy as np
import pandas as pd
import pandas.io.data as web
import matplotlib as mpl
%matplotlib inline

mpl.style.use('ggplot')
mpl.rcParams['figure.figsize'] = (8,6)

# grab some price data
px = web.DataReader('AAPL', "yahoo", '2010-12-01')['Adj Close']
px_m = px.asfreq('M', method='ffill')
rets_m = px_m.pct_change()

rets_m.plot(kind='bar')

generates this plot:

Generated plot

Yikes. How can I get the ticks to be every month or quarter or something sensible? And how can the date formatting be changed to get rid of times?

I've tried various things with ax.set_xticks() and ax.xaxis.set_major_formatter but haven't been able to figure it out.

Upvotes: 1

Views: 1343

Answers (1)

CT Zhu
CT Zhu

Reputation: 54330

If you use the plot method in pandas, the set_major_locator and set_major_formatter methods of matplotlib is likely to fail. It might just be easier to manually adjust the ticks, if you want to stay with pandas``plot methods.

#True if it is the first month of a quarter, False otherwise
xtick_idx = np.hstack((True, 
                       np.diff(rets_m.index.quarter)!=0))

#Year-Quarter string for the tick labels.
xtick     = ['{0:d} quarter {1:d}'.format(*item) 
             for item in zip(rets_m.index.year, rets_m.index.quarter)]
ax        =rets_m.plot(kind='bar')

#Only put ticks on the 1st months of each quarter
ax.xaxis.set_ticks(np.arange(len(xtick))[xtick_idx])

#Adjust the ticklabels
ax.xaxis.set_ticklabels(np.array(xtick)[xtick_idx])

enter image description here

Upvotes: 2

Related Questions