Установите ширину полосы, используя broken_barh с датами в matplotlib

#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')