Calendar Heatmap
Daily Steps Heatmap
Calendar view of daily step counts with health goal tracking.
Output
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
More Calendar Heatmap examples
☕