Calendar Heatmap

Hydration Tracker Calendar

Daily water intake visualization tracking hydration goals.

Output
Hydration Tracker Calendar
Python
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
import matplotlib.patches as mpatches

np.random.seed(147)

# Generate water intake (glasses per day, 0-10)
days = 365
water = np.random.choice([2, 4, 5, 6, 7, 8, 9, 10], size=days, p=[0.05, 0.1, 0.15, 0.2, 0.2, 0.15, 0.1, 0.05])

water_levels = np.digitize(water, bins=[0, 3, 5, 7, 8, 10]) - 1

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

# Cyan water gradient
colors = ['#0a0a0f', '#083344', '#0e7490', '#06b6d4', '#22d3ee', '#67e8f9']
cmap = LinearSegmentedColormap.from_list('hydration', 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 Hydration - Glasses of Water', 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, ['<3', '3-5', '5-7', '7-8', '8-10', '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')

goal_days = int(np.sum(water >= 8))
avg = np.mean(water)
ax.annotate(f'Goal (8+): {goal_days} days | Avg: {avg:.1f} glasses/day', xy=(0.98, 1.1), xycoords='axes fraction',
            fontsize=11, color='#22d3ee', 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