使用hist()函数绘制日期时间对象的直方图时,无法对齐条形柱。

7

我将尝试绘制一些日期时间对象的直方图,但是我无法使条形图与条形框对齐。以下是我的代码:

首先,我导入所需的内容并声明开始、结束和一天的对象:

import datetime
import matplotlib.pyplot as plt

end = datetime.date(2017,5,14) 
start = datetime.date(2017,5,8) 
one_day = datetime.timedelta(days = 1)  

然后我声明一个任意的日期列表:

date_list = [datetime.date(2017,5,14), datetime.date(2017,5,14), 
datetime.date(2017,5,14), datetime.date(2017,5,9), datetime.date(2017,5,13), 
datetime.date(2017,5,12), datetime.date(2017,5,11), 
datetime.date(2017,5,11), datetime.date(2017,5,9)]

然后我遍历了起始日期和结束日期之间的每一天(在这个例子中是一周),将每个日期添加到一个列表中:

week = [] 
for i in range((end-start).days+1):  
    week.append(start + (i)*one_day)

这是因为一周中的某些日子在日期列表中不存在(我知道这种情况下我可以跳过它,但我希望它可以扩展到其他日期列表)。然后我用hist()绘图:
plt.hist(date_list, bins = len(week)+1)
plt.show()

我尝试了各种二进制格式的组合,包括不同的加1和范围对齐方式,但日期从未在条形图中保持一致的位置。


尝试使用plt.hist(date_list, bins = len(week)+1, align='left') - kingmakerking
1个回答

7
如果只是设置箱子的数量,那么箱子将在数据的第一个和最后一个值之间平均分布。由于数据缺少例如“start”值,因此箱子将小于完整的一天。
为了克服这个问题,需要将所需的箱子明确设置为“hist”的“bins”参数。不幸的是,在这里不能直接使用日期时间列表,因此需要先将日期时间转换为数字。可以使用matplotlib的“matplotlib.dates.date2num”方法来完成此操作。
完整的示例:
import datetime
import matplotlib.pyplot as plt
from matplotlib.dates import date2num

end = datetime.date(2017,5,14) 
start = datetime.date(2017,5,8) 
one_day = datetime.timedelta(days = 1)  

date_list = [datetime.date(2017,5,14), datetime.date(2017,5,14), 
datetime.date(2017,5,14), datetime.date(2017,5,9), datetime.date(2017,5,13), 
datetime.date(2017,5,12), datetime.date(2017,5,11), 
datetime.date(2017,5,11), datetime.date(2017,5,9)]

week = [] 
for i in range((end-start).days+1):  
    week.append(start + (i)*one_day)

numweek = date2num(week)

plt.hist(date_list, bins = numweek, ec="k")
plt.gcf().autofmt_xdate()
plt.show()

enter image description here

请注意,datetime.date(2017,5,14) 是位于 (2017,5,13)(2017,5,14) 之间的 bin 中,因此您可能需要将 enddate 设置为 datetime.date(2017,5,15)

非常感谢!我一直为此苦恼。 - emily

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接