Calendar Heatmap

UV Index Calendar

Daily UV radiation index showing sun exposure risk levels.

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

np.random.seed(203)

days = 365
# Simulate UV - high in summer, low in winter
base_uv = 6 + 5 * np.sin(2 * np.pi * (np.arange(days) - 80) / 365)
uv = base_uv + np.random.normal(0, 1.5, days)
uv = np.clip(uv, 0, 12)

uv_levels = np.digitize(uv, bins=[0, 2, 4, 6, 8, 10]) - 1

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

# Temperature palette
colors = ['#1e3a8a', '#3b82f6', '#22d3ee', '#fbbf24', '#f97316', '#dc2626']
cmap = LinearSegmentedColormap.from_list('uv', 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('UV Index - Sun Exposure Risk', 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, ['Low 0-2', 'Low 2-4', 'Mod 4-6', 'High 6-8', 'V.High 8-10', 'Extreme 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')

high_days = int(np.sum(uv >= 6))
ax.annotate(f'{high_days} high UV days - sunscreen recommended', xy=(0.98, 1.1), xycoords='axes fraction',
            fontsize=11, color='#f97316', 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