Calendar Heatmap

Website Traffic Calendar

Daily unique visitors heatmap for web analytics and traffic patterns.

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

np.random.seed(666)

days = 365
traffic = np.random.lognormal(8, 0.5, days).astype(int)
traffic = np.clip(traffic, 500, 15000)

traffic_levels = np.digitize(traffic, bins=[0, 1500, 3000, 5000, 8000, 12000]) - 1

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

colors = ['#0a0a0f', '#164e63', '#0891b2', '#22d3ee', '#67e8f9', '#a5f3fc']
cmap = LinearSegmentedColormap.from_list('traffic', 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('Website Traffic - Daily Unique Visitors', 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.5K', '1.5-3K', '3-5K', '5-8K', '8-12K', '12K+'])]
ax.legend(handles=legend_elements, loc='upper left', bbox_to_anchor=(0, -0.15), ncol=6, 
          fontsize=8, facecolor='#1e293b', edgecolor='#334155', labelcolor='white')

total = int(np.sum(traffic))
avg = int(np.mean(traffic))
ax.annotate(f'Total: {total:,} visitors | Avg: {avg:,}/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