import calendar
import numpy as np
from matplotlib.patches import Rectangle
import matplotlib.pyplot as plt
def plot_calendar(days, months):
plt.figure(figsize=(9, 3))
# non days are grayed
ax = plt.gca().axes
ax.add_patch(Rectangle((29, 2), width=.8, height=.8,
color='gray', alpha=.3))
ax.add_patch(Rectangle((30, 2), width=.8, height=.8,
color='gray', alpha=.5))
ax.add_patch(Rectangle((31, 2), width=.8, height=.8,
color='gray', alpha=.5))
ax.add_patch(Rectangle((31, 4), width=.8, height=.8,
color='gray', alpha=.5))
ax.add_patch(Rectangle((31, 6), width=.8, height=.8,
color='gray', alpha=.5))
ax.add_patch(Rectangle((31, 9), width=.8, height=.8,
color='gray', alpha=.5))
ax.add_patch(Rectangle((31, 11), width=.8, height=.8,
color='gray', alpha=.5))
for d, m in zip(days, months):
ax.add_patch(Rectangle((d, m),
width=.8, height=.8, color='C0'))
plt.yticks(np.arange(1, 13)+.5, list(calendar.month_abbr)[1:])
plt.xticks(np.arange(1,32)+.5, np.arange(1,32))
plt.xlim(1, 32)
plt.ylim(1, 13)
plt.gca().invert_yaxis()
# remove borders and ticks
for spine in plt.gca().spines.values():
spine.set_visible(False)
plt.tick_params(top=False, bottom=False, left=False, right=False)
plt.show()
You can use it to highlight the days with full moon in 2018:
full_moon_day = [2, 31, 2, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22] full_moon_month = [1, 1, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] plot_calendar(full_moon_day, full_moon_month)
Or just highlight all the weekends:
from datetime import datetime, timedelta
def get_weekends(year):
weekend_day = []
weekend_month = []
start = datetime(year, 1, 1)
for i in range(365):
day_of_the_year = start + timedelta(days=i)
if day_of_the_year.weekday() > 4:
weekend_day.append(day_of_the_year.day)
weekend_month.append(day_of_the_year.month)
return weekend_day, weekend_month
weekend_day, weekend_month = get_weekends(2018)
plot_calendar(weekend_day, weekend_month)


