Python:使用DataFrame绘制线图和条形图时DatetimeIndex的不同行为
我有一个数据框,行索引作为DatetimeIndex 当我绘制直线和条形图时,这个指数在x轴上的显示方式不同。我的代码如下:Python:使用DataFrame绘制线图和条形图时DatetimeIndex的不同行为,python,pandas,Python,Pandas,我有一个数据框,行索引作为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_
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)
ax = df.plot(kind='bar', stacked = False)
ax.set_xticklabels([t.get_text().split()[0] for t in ax.get_xticklabels()])
我得到的情节如下。在x轴上具有良好日期格式的线图:
不在x轴上设置日期格式的条形图:
在直线图中,x轴标签的格式良好,左角有月份和年份,日期用作x记号。但在条形图中,整个日期和时间(00:00:00)的显示方式与线形图不同
如何在不显示时间的情况下,在条形图中获得x轴上日期的正确格式?问题出在
pandas
的源代码中。如果不派生自定义子类或直接使用matplotlib
,则无法使条形图使用pd.DateTimeFormatter
在pandas.tools.plotting
的第1766行中,完成了LinePlot
的日期时间格式设置。这在条形图中不存在,原因我只能假设:
折线图用于打印时间序列数据,而柱状图则不一定如此
我仍然希望条形图能够在不使用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]})
条形图通常用于绘制分类数据。这意味着与线形图不同,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)
ax = df.plot(kind='bar', stacked = False)
ax.set_xticklabels([t.get_text().split()[0] for t in ax.get_xticklabels()])
另外添加ax.figure.autofmtxdate()
旋转和重新居中标签以减少空间
使用此解决方案,我可以使用strftime()函数的不同指令来获取工作日名称,还可以使用更多指令来向我的图形中添加其他详细信息,例如%a来获取缩写的工作日名称。我使用与您的解决方案相同的代码在xticks上获取线图的工作日名称,但它不起作用,只给了我一个空图。它是否与线条图的现有格式冲突?