Это может быть достигнуто с помощью следующей адаптации вашего кода. Новая функция принимает параметр days
, который должен быть списком (day, color)
кортежей, которые нужно пометить для каждого устройства, которое вы хотите построить. Также требуется дополнительный параметр days_in_month
для обеспечения совместимости с месяцами, у которых менее 31 дня.
Код:
def plot_device_calendar(days, days_in_month=31):
plt.figure(figsize=(.3*days_in_month, .3*len(days)))
ax = plt.gca().axes
for device, days_to_mark in enumerate(days, start=1):
for d in days_to_mark:
ax.add_patch(Rectangle((d[0], device),
width=.8, height=.8, color=d[1]))
plt.yticks(np.arange(1, len(days)+1)+.5, [f"device_{i}" for i in range(1, len(days)+1)])
plt.xticks(np.arange(1,days_in_month+1)+.5, np.arange(1,days_in_month+1))
plt.xlim(1, days_in_month+1)
plt.ylim(1, len(days)+1)
plt.gca().invert_yaxis()
for spine in plt.gca().spines.values():
spine.set_visible(False)
plt.tick_params(top=False, bottom=False, left=False, right=False)
plt.show()
Пример ввода : (3 устройства, 10 случайных дней и цветов)
>>> l = [[(30, 'r'), (23, 'b'), (31, 'g'), (16, 'm'), (10, 'g'), (7, 'r'), (27, 'g'), (6, 'y'), (3, 'y'), (14, 'g')],
[(22, 'y'), (21, 'w'), (16, 'y'), (23, 'c'), (8, 'g'), (31, 'w'), (15, 'k'), (12, 'k'), (6, 'm'), (24, 'r')],
[(31, 'c'), (10, 'c'), (2, 'k'), (17, 'g'), (30, 'y'), (3, 'g'), (14, 'y'), (23, 'y'), (4, 'r'), (22, 'r')]]
Использование:
>>> colors = ['b','g','r','c','m','y','k','w']
>>> l = [random.sample(range(1,32), 10) for i in range(20)]
>>> l = [[(x,random.choice(colors)) for x in sl] for sl in l]
>>> plot_device_calendar(l)
Вывод: