#python #matplotlib
#python #matplotlib
Вопрос:
Я пытаюсь создать диаграмму Ганта, но я не могу понять, как определить xwidth часть broken_barh в правильном формате данных. Единственный формат, который я могу использовать, — это формат даты, но полоса всегда оказывается слишком широкой, и я бы предпочел ввести количество дней.
Я бы хотел, чтобы полоса, которая отображается ниже, растягивалась между 01/09/2021 и 01/10/2021 (британский стандарт даты).
import matplotlib.pyplot as plt
import datetime as dt
from datetime import timedelta
from datetime import date
fig, gnt = plt.subplots()
# Setting Y-axis limits
gnt.set_ylim(0, 280)
# Setting X-axis limits
datemin = dt.date(2020, 12, 1)
datemax = dt.date(2021, 12, 31)
gnt.set_xlim(datemin, datemax)
gnt.set_xlabel('Date')
gnt.set_ylabel('Survey')
# Setting ticks on y-axis
gnt.set_yticks([15,25,35,45,55,65,75,85,95,105,115,125,135,145,155,165,175,185,195,205,215,225,235,245,255,265])
# Labelling tickes of y-axis
gnt.set_yticklabels(['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26'])
# Setting graph attribute
gnt.grid(True)
gnt.broken_barh([
(
date(2021, 9, 1),
date(2021, 10, 1)
)],
(260, 9), facecolors =('tab:orange'))
fig.set_size_inches(12, 15)
Диаграмма, с которой я заканчиваю, выглядит следующим образом:
и очевидно, что ширина полосы, которую я хочу представить в виде месяца, слишком велика.
Как мне нужно отформатировать часть xWidth функции broken_barh? Я хочу иметь возможность указывать количество дней.
Заранее спасибо!
Ответ №1:
Для всех, кто читает, я нашел довольно грязное решение. Часть продолжительности (xrange) функции .broken_barh может быть отображена путем добавления требуемого количества дней к минимально возможной дате начала (01/01/01).:
import matplotlib.pyplot as plt
import datetime as dt
from datetime import timedelta
from datetime import date
fig, gnt = plt.subplots()
# Setting Y-axis limits
gnt.set_ylim(0, 280)
# Setting X-axis limits
datemin = dt.date(2020, 12, 1)
datemax = dt.date(2021, 12, 31)
gnt.set_xlim(datemin, datemax)
gnt.set_xlabel('Date')
gnt.set_ylabel('Survey')
# Setting ticks on y-axis
gnt.set_yticks([15,25,35,45,55,65,75,85,95,105,115,125,135,145,155,165,175,185,195,205,215,225,235,245,255,265])
# Labelling tickes of y-axis
gnt.set_yticklabels(['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26'])
# Setting graph attribute
gnt.grid(True)
gnt.broken_barh([
(
date(2021, 9, 1),
date(1, 1, 1) timedelta(days=10) #This adds a width of 10 days
)],
(260, 9), facecolors =('tab:orange'))
fig.set_size_inches(12, 15)
Комментарии:
1. Или просто используйте dt.date.fromordinal(10) вместо: date(1, 1, 1) timedelta(days = 10)
2. Для меня решением было просто использовать timedeltas. Т.е.
broken_barh([(date1, dt.timedelta(days=10)), (date2, dt.timedelta(days=5))], (10, 9), facecolors='tab:blue')