Calendar Heatmap

Daily Steps Heatmap

Calendar view of daily step counts with health goal tracking.

Output
Daily Steps Heatmap
Python
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
import matplotlib.patches as mpatches

np.random.seed(456)

# Generate step data (0-15000 steps)
days = 365
steps = np.random.normal(8000, 3000, days).astype(int)
steps = np.clip(steps, 0, 18000)

# Normalize to 0-5 scale
step_levels = np.digitize(steps, bins=[0, 3000, 5000, 8000, 10000, 15000]) - 1

weeks = 53
data = np.zeros((7, weeks))
for i, val in enumerate(step_levels):
    week = i // 7
    day = i % 7
    if week < weeks:
        data[day, week] = val

# Light theme blue gradient
colors = ['#ffffff', '#dbeafe', '#93c5fd', '#3b82f6', '#1d4ed8', '#1e3a8a']
cmap = LinearSegmentedColormap.from_list('steps', colors, N=256)

fig, ax = plt.subplots(figsize=(16, 4), facecolor='#ffffff')
ax.set_facecolor('#ffffff')

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

ax.set_title('Daily Steps - Annual Overview', fontsize=16, color='#111827', fontweight='bold', pad=15)

for i in range(8):
    ax.axhline(y=i-0.5, color='#e5e7eb', linewidth=0.5)
for i in range(weeks+1):
    ax.axvline(x=i-0.5, color='#e5e7eb', linewidth=0.5)

ax.tick_params(colors='#374151', length=0)
for spine in ax.spines.values():
    spine.set_visible(False)

legend_elements = [mpatches.Patch(facecolor=c, label=l, edgecolor='#d1d5db') 
                   for c, l in zip(colors, ['<3K', '3-5K', '5-8K', '8-10K', '10-15K', '>15K'])]
ax.legend(handles=legend_elements, loc='upper left', bbox_to_anchor=(0, -0.15), ncol=6, 
          fontsize=8, facecolor='white', edgecolor='#d1d5db', labelcolor='#374151')

goal_days = int(np.sum(steps >= 10000))
avg_steps = int(np.mean(steps))
ax.annotate(f'Goal reached: {goal_days} days | Avg: {avg_steps:,} steps/day', xy=(0.98, 1.1), xycoords='axes fraction',
            fontsize=10, color='#1d4ed8', ha='right', fontweight='bold')

plt.tight_layout()
plt.subplots_adjust(bottom=0.25)
plt.show()
Library

Matplotlib

Category

Time Series

Did this help you?

Support PyLucid to keep it free & growing

Support