Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to adjust x-axis DateFormat in pandas bar chart

I wish to plot a pandas time-series object data with matplotlib. For a simple line chart data.plot(), I was able to successfully change the x-axis date format with ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d %H:%M:%S')).

However, I am not able to do the same for a bar chart data.plot(kind='bar'). And the chart wouldn't appear. Is there a way to change data format for pandas bar chart? I know I can create a chart with plt.bar method, but I need to use pandas stacked bar chart for more complicated data.

import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import pandas as pd
import datetime as dt
import time

n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
values=np.sin((timestamps-now)/duration*2*np.pi)
data=pd.Series(values, index=dates)

fig=figure(figsize(5,5))
ax=fig.add_subplot(111)
data.plot(kind='bar')
ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d %H:%M:%S'))
like image 666
KLI Avatar asked Oct 16 '13 18:10

KLI


1 Answers

Since Pandas simply uses matplotlib you can of course create an identical (stacked) barchart with matplotlib. There is not reason why you can only use Pandas for that.

Its not going to help in this case though. Matplotlib's bar() changes the xvalues from dates to floats, therefore a DateFormatter doesnt work anymore. You can check the xticks with ax.get_xticks().

I dont see how you can make the xticks dates, but you can override the xticklabels yourself:

ax.set_xticklabels([dt.strftime('%Y-%m-%d %H:%M:%S') for dt in data.index.to_pydatetime()])
like image 124
Rutger Kassies Avatar answered Oct 24 '22 00:10

Rutger Kassies