Невозможно выровнять ячейки в гистограмме объектов datetime с помощью функции hist()
Поэтому я пытаюсь построить гистограмму некоторых объектов даты и времени, но я никогда не смогу выровнять ячейки по столбцам. Мой код ниже:
Я начинаю с того, что импортирую свои вещи и объявляю начало, конец и однодневный объект:
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).
Тогда я заговор с историей ():
plt.hist(date_list, bins = len(week)+1)
plt.show()
Я испробовал всевозможные комбинации форматов бина с различными +1 и диапазонами и выравниванием, но дата никогда не сидит в согласованном месте на панели.
1 ответ
Если просто установить количество ячеек, то они будут равномерно распределены между первым и последним значением (данных). Так как данные, например, отсутствуют start
значение, контейнеры будут меньше, чем полный день.
Чтобы преодолеть это, нужно явно установить желаемые ячейки для bins
аргумент hist
, К сожалению, здесь нельзя напрямую использовать список дат и времени, поэтому сначала нужно конвертировать даты и числа в числа. Это можно сделать с помощью 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)
, так что вы можете установить конечную дату в datetime.date(2017,5,15)
,