Calendar Heatmap
Productivity Score Calendar
Daily productivity tracking with focus time and task completion metrics.
Output
Python
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
import matplotlib.patches as mpatches
np.random.seed(444)
days = 365
# Lower on weekends
productivity = np.zeros(days)
for i in range(days):
dow = i % 7
if dow < 5:
productivity[i] = np.random.choice([3, 5, 6, 7, 8, 9, 10], p=[0.05, 0.1, 0.15, 0.25, 0.25, 0.15, 0.05])
else:
productivity[i] = np.random.choice([0, 2, 4, 5, 6], p=[0.3, 0.25, 0.25, 0.15, 0.05])
prod_levels = np.digitize(productivity, bins=[0, 2, 4, 6, 8, 9]) - 1
weeks = 53
data = np.zeros((7, weeks))
for i, val in enumerate(prod_levels):
week = i // 7
day = i % 7
if week < weeks:
data[day, week] = val
colors = ['#0a0a0f', '#1e3a5f', '#2563eb', '#3b82f6', '#60a5fa', '#93c5fd']
cmap = LinearSegmentedColormap.from_list('productivity', colors, N=256)
fig, ax = plt.subplots(figsize=(16, 4), facecolor='#0a0a0f')
ax.set_facecolor('#0a0a0f')
im = ax.imshow(data, cmap=cmap, aspect='auto', vmin=0, vmax=5)
ax.set_yticks(range(7))
ax.set_yticklabels(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], fontsize=9, color='#e2e8f0')
ax.set_xticks(range(0, 52, 4))
ax.set_xticklabels(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', ''],
fontsize=9, color='#e2e8f0')
ax.set_title('Daily Productivity Score (1-10)', fontsize=16, color='white', fontweight='bold', pad=15)
for i in range(8):
ax.axhline(y=i-0.5, color='#1e293b', linewidth=0.5)
for i in range(weeks+1):
ax.axvline(x=i-0.5, color='#1e293b', linewidth=0.5)
ax.tick_params(colors='#e2e8f0', length=0)
for spine in ax.spines.values():
spine.set_visible(False)
legend_elements = [mpatches.Patch(facecolor=c, label=l, edgecolor='#334155')
for c, l in zip(colors, ['1-2', '3-4', '5-6', '7-8', '9', '10'])]
ax.legend(handles=legend_elements, loc='upper left', bbox_to_anchor=(0, -0.15), ncol=6,
fontsize=8, facecolor='#1e293b', edgecolor='#334155', labelcolor='white')
avg = np.mean(productivity)
high_days = int(np.sum(productivity >= 8))
ax.annotate(f'Avg Score: {avg:.1f}/10 | {high_days} high productivity days', xy=(0.98, 1.1), xycoords='axes fraction',
fontsize=11, color='#60a5fa', ha='right', fontweight='bold')
plt.tight_layout()
plt.subplots_adjust(bottom=0.25)
plt.show()
Library
Matplotlib
Category
Time Series
More Calendar Heatmap examples
☕