Calendar Heatmap
Meditation Practice Calendar
Mindfulness meditation tracking showing daily practice duration.
Output
Python
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
import matplotlib.patches as mpatches
np.random.seed(321)
# Generate meditation minutes (0, 5, 10, 15, 20, 30+)
days = 365
meditation = np.random.choice([0, 0, 5, 10, 15, 20, 30], size=days, p=[0.25, 0.1, 0.15, 0.2, 0.15, 0.1, 0.05])
# Normalize to levels
med_levels = np.digitize(meditation, bins=[0, 1, 5, 10, 15, 25]) - 1
weeks = 53
data = np.zeros((7, weeks))
for i, val in enumerate(med_levels):
week = i // 7
day = i % 7
if week < weeks:
data[day, week] = val
# Cyan/teal gradient for calm
colors = ['#0a0a0f', '#042f2e', '#0d9488', '#2dd4bf', '#5eead4']
cmap = LinearSegmentedColormap.from_list('meditation', 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=4)
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('Meditation Practice - Daily Minutes', 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, ['None', '5min', '10min', '15min', '20min+'])]
ax.legend(handles=legend_elements, loc='upper left', bbox_to_anchor=(0, -0.15), ncol=5,
fontsize=8, facecolor='#1e293b', edgecolor='#334155', labelcolor='white')
practice_days = int(np.sum(meditation > 0))
total_mins = int(np.sum(meditation))
ax.annotate(f'{practice_days} days practiced | {total_mins//60}h {total_mins%60}m total', xy=(0.98, 1.1), xycoords='axes fraction',
fontsize=11, color='#2dd4bf', ha='right', fontweight='bold')
plt.tight_layout()
plt.subplots_adjust(bottom=0.25)
plt.show()
Library
Matplotlib
Category
Time Series
More Calendar Heatmap examples
☕