我希望用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'))
答案 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)
。显然,如果您的元组有更多方面(即日,小时),那么您可以将它们添加到日期时间函数