无法使用 hist() 函数对齐日期时间对象直方图中的 bin
Unable to align bins in a histogram of datetime objects using the hist() function
所以我试图绘制一些日期时间对象的直方图,但我永远无法让箱子与条形对齐。我的代码如下:
我首先导入我的东西并声明开始、结束和一天对象:
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)
原因是一周中的某些日子没有出现在 date_list 中(我知道对于这种情况我可以跳过这个,但我希望它可以扩展到其他 date_lists)。
然后我用 hist():
作图
plt.hist(date_list, bins = len(week)+1)
plt.show()
我已经尝试了各种 bin 格式与各种 +1 和范围和对齐方式的组合,但日期从未位于栏中一致的位置。
如果简单地设置 bin 的数量,bin 将在(数据的)第一个和最后一个值之间平均分配。由于数据是例如缺少 start
值,垃圾箱将小于一整天。
为了克服这个问题,需要明确地将所需的 bin 设置为 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()
请注意,datetime.date(2017,5,14)
是 (2017,5,13)
和 (2017,5,14)
之间的 bin 的一部分,因此您可能希望将结束日期设置为
datetime.date(2017,5,15)
.
所以我试图绘制一些日期时间对象的直方图,但我永远无法让箱子与条形对齐。我的代码如下:
我首先导入我的东西并声明开始、结束和一天对象:
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)
原因是一周中的某些日子没有出现在 date_list 中(我知道对于这种情况我可以跳过这个,但我希望它可以扩展到其他 date_lists)。
然后我用 hist():
作图plt.hist(date_list, bins = len(week)+1)
plt.show()
我已经尝试了各种 bin 格式与各种 +1 和范围和对齐方式的组合,但日期从未位于栏中一致的位置。
如果简单地设置 bin 的数量,bin 将在(数据的)第一个和最后一个值之间平均分配。由于数据是例如缺少 start
值,垃圾箱将小于一整天。
为了克服这个问题,需要明确地将所需的 bin 设置为 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()
请注意,datetime.date(2017,5,14)
是 (2017,5,13)
和 (2017,5,14)
之间的 bin 的一部分,因此您可能希望将结束日期设置为
datetime.date(2017,5,15)
.