Python:使用DataFrame绘制线条和条形图时DatetimeIndex的不同行为

时间:2017-02-25 11:21:58

标签: python pandas

我有一个DataFrame,其行索引为DatetimeIndex。

当我制作直线和条形图时,x轴上的指数会有所不同。我的代码如下:

start_date = datetime.datetime.strptime('2017-02-20', '%Y-%m-%d').date()
end_date = datetime.datetime.strptime('2017-02-23', '%Y-%m-%d').date()

daterange = pd.date_range(start_date, end_date)
df = pd.DataFrame(index = daterange, data = {'Male':[12, 23, 13, 11], 'Female': [10, 25, 15, 9]})


df.plot(kind='line')
df.plot(kind='bar', stacked = False, grid=1)

我获得的情节如下。线图在x轴上具有很好的日期格式:

Line plot with nice formatting of dates on x-axis

在x轴上没有日期格式的条形图:

Bar plot without formatting of dates on x-axis

在折线图中,x轴标签格式正确,左下角是月份和年份,日期用作x-ticks。但是在条形图中,显示的是整个日期以及时间(00:00:00),与线图不同。

如何在条形图中正确格式化x轴上的日期并且不显示时间?

2 个答案:

答案 0 :(得分:1)

问题出在pandas的源代码中。您无法在不派生自定义子类或直接使用pd.DateTimeFormatter的情况下使用matplotlib条形图。

pandas.tools.plotting的第1766行(1784 in the dev version)中,LinePlot的日期时间格式已完成。这在BarPlot中不存在,原因我只能假设:

折线图用于打印时间序列数据,而条形图则不一定有意义。

我仍然希望看到条形图能够在不使用matplotlib的情况下正确格式化日期,因此您可能希望打开pandas项目的问题。

直接使用matplotlib

import pandas as pd
import datetime
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt

start_date = datetime.datetime.strptime('2017-02-20', '%Y-%m-%d').date()
end_date = datetime.datetime.strptime('2017-02-23', '%Y-%m-%d').date()
daterange = pd.date_range(start_date, end_date)
df = pd.DataFrame(index = daterange, data = {'Male':[12, 23, 13, 11], 'Female': [10, 25, 15, 9]})
ax=df.plot.bar(xticks=df.index.month, stacked = False, grid=1)
ticklabels = [item.strftime('%b %d') for item in df.index]
ax.xaxis.set_major_formatter(ticker.FixedFormatter(ticklabels))
plt.gcf().autofmt_xdate()

plt.show()

Correctly formatted

答案 1 :(得分:0)

条形图通常用于绘制分类数据。这意味着与线图不同,x值只是递增的整数值,而不是日期。然后标签就是数据框中的文本。

摆脱小时和分钟的简单方法是重置标签,如下所示:

ax = df.plot(kind='bar', stacked = False)
ax.set_xticklabels([t.get_text().split()[0] for t in ax.get_xticklabels()])

enter image description here

此外,添加ax.figure.autofmt_xdate()会旋转并重新标记标签以减少占用空间。

enter image description here