我有一个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轴上具有很好的日期格式:
在x轴上没有日期格式的条形图:
在折线图中,x轴标签格式正确,左下角是月份和年份,日期用作x-ticks。但是在条形图中,显示的是整个日期以及时间(00:00:00),与线图不同。
如何在条形图中正确格式化x轴上的日期并且不显示时间?
答案 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()
答案 1 :(得分:0)