2017-02-25 171 views
2

我有一个DataFrame,其行索引为DatetimeIndex。Python:DatetimeIndex的不同行为,同时使用DataFrame绘制线条和条形图

当我制作线条和条形图时,此索引在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轴日期的正确格式并且没有时间显示?

回答

1

问题出在pandas的源代码中。无法直接使用pd.DateTimeFormatter而无需派生自定义子类或直接使用matplotlib

在行1766 (1784 in the dev version)pandas.tools.plottingLinePlot的日期时间格式化完成。这在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

+0

有了这个解决方案,我可以使用的strftime不同的指令()函数来获得工作日名称多为添加额外的细节我图形像一个%用于获取简写的星期几。我使用相同的代码作为您的解决方案,以获得线图的xticks上的星期几名称,但它不适用于它给我只有一个空的情节。它是否与LinePlot的现有格式冲突? – zingsy

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()旋转,recenters标签采取更少的空间。

enter image description here

相关问题