Calendar Heatmap

Customer Support Tickets Calendar

Support ticket volume heatmap for resource planning.

Output
Customer Support Tickets Calendar
Python
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
import matplotlib.patches as mpatches

np.random.seed(222)

days = 365
tickets = np.random.poisson(15, days)
tickets = np.clip(tickets, 0, 40)

ticket_levels = np.digitize(tickets, bins=[0, 8, 15, 22, 30, 40]) - 1

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

colors = ['#ffffff', '#f0fdf4', '#bbf7d0', '#4ade80', '#16a34a', '#14532d']
cmap = LinearSegmentedColormap.from_list('tickets', 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('Support Ticket Volume - Daily Trends', 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, ['<8', '8-15', '15-22', '22-30', '30-40', '40+'])]
ax.legend(handles=legend_elements, loc='upper left', bbox_to_anchor=(0, -0.15), ncol=6, 
          fontsize=8, facecolor='white', edgecolor='#d1d5db', labelcolor='#374151')

total = int(np.sum(tickets))
avg = np.mean(tickets)
ax.annotate(f'Total Tickets: {total:,} | Avg: {avg:.1f}/day', xy=(0.98, 1.1), xycoords='axes fraction',
            fontsize=10, color='#16a34a', 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