8

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

2 回答 2

17

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

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

我看不出如何制作 xticks 日期,但您可以自己覆盖 xticklabels:

ax.set_xticklabels([dt.strftime('%Y-%m-%d %H:%M:%S') for dt in data.index.to_pydatetime()])
于 2013-10-17T07:49:46.783 回答
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])

我的按月汇总和分组,因此index元组仅(2009,4)作为示例。显然,如果您的元组有更多方面(即天、小时),那么您会将这些添加到 datetime 函数中

于 2016-05-26T23:12:47.563 回答