无法在pandas条形图中调整x轴日期格式

时间:2013-10-16 18:06:22

标签: matplotlib pandas

我希望用matplotlib绘制一个pandas时间序列对象data。对于简单的折线图data.plot(),我能够使用ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d %H:%M:%S'))成功更改x轴日期格式。

但是,对于条形图data.plot(kind='bar'),我无法做同样的事情。图表不会出现。有没有办法改变熊猫条形图的数据格式?我知道我可以用plt.bar方法创建一个图表,但我需要使用pandas堆积条形图来获得更复杂的数据。

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'))

2 个答案:

答案 0 :(得分:17)

由于Pandas只使用matplotlib,您当然可以使用matplotlib创建相同(堆叠)的条形图。没有理由为什么你只能使用熊猫。

但在这种情况下它不会有所帮助。 Matplotlib的bar()将xvalues从日期更改为浮点数,因此DateFormatter不再起作用。您可以使用ax.get_xticks()检查xticks。

我不知道如何制作xticks日期,但你可以自己覆盖xticklabels:

ax.set_xticklabels([dt.strftime('%Y-%m-%d %H:%M:%S') for dt in data.index.to_pydatetime()])

答案 1 :(得分:0)

如果您使用groupby对数据进行分组,那么您可以使用以下答案执行相同的操作:

new_ticks = []
for dt in data.index:
    new_ticks.append(datetime.datetime(dt[0],dt[1],1))
ax.set_xticklabels([dt.strftime('%Y-%m') for dt in new_ticks])

对Mine进行求和并按月分组,因此index元组仅为(2009,4)。显然,如果您的元组有更多方面(即日,小时),那么您可以将它们添加到日期时间函数