Heat Map plan table — visualization variants

Mondays in August 2025 · summer split shift (Shift 1 8:30 AM–5:30 PM, Shift 2 10 AM–7 PM, Ryan 9:30 AM–6:30 PM). ⚠ Historical prototype: "5 PM crunch" observations below were computed against the old Shift 1 end of 5:00 PM and Ryan end of 6:00 PM. Current shift times extend S1 to 5:30 and Ryan to 6:30, so the 5–5:30 PM gap described below no longer exists.

DE
Senior Design Engineer's take
Brought to the dashboard · 2026-04-17

The table gets the math right but reads like a spreadsheet wearing a web app's clothes. There's real information here — demand cascade, coach-by-coach plan, appointment capacity — but it's presented as one undifferentiated 22-column grid. The eye has nowhere to land.

What's working

  • Chip-aligned row rhythm. The orange/emerald/slate chips on demand & apt rows now share the silhouette of the coach cells. Visual unity is there — that's the biggest recent win.
  • Per-row Max/Avg toggle. Keeps default view clean, progressive-disclosure for the 2025 comparison. Good.
  • Admin vs Huddle distinction. Slate vs purple reads clearly. No one will confuse them.

What's hurting it

  1. It scrolls horizontally. 22 slots × 70px = 1,540px of table in a 1,100px container. Half the day is hidden below the fold / off-screen. For a "show this to Jason" planning artifact, that's fatal — screenshots will always cut off.
  2. No visual hierarchy across the rows. "Athletes / slot" max row, "Coaches allocated" row, "Coach 1" row, and "Max appointments" row all have the same weight. A glance can't tell you which three rows are "demand", which seven are "who does what", which two are "the answer".
  3. The day's shape is invisible. You can't see at-a-glance where the crunch is. There's no sparkline, no area chart, no emphasis — just 22 cells of equal prominence in every row. Summer Monday at 5 PM is literally a crunch point (max_apts = 0 then jumps back to 3 at 5:30 PM) but nothing about the rendering draws your eye there.
  4. The "Admin" block is visually honest but narratively dead. Four consecutive slate chips across seven coaches = 28 identical cells. That's a lot of real estate spent on "nothing happens here." In a planning view this should collapse.
  5. Time axis is only at the top. When you're scanning Coach 6's row 200px below the header, you're counting columns to find "what slot is this." Linear and Notion both repeat axis labels for this reason.
  6. Max appointments is the output — it should dominate. Right now it's a single thin row near the bottom, same visual weight as "Athletes in gym." The whole point of this screen is "how many appointments can we run where?" — that answer should be the hero.

My prescription

Pick one of the four variants below. My personal vote: a hybrid of (Gantt lanes give the day a shape coaches recognize from their own schedules) and (the sparklines above and below tell you instantly where the crunch is). The current table is fine as a "spreadsheet export" view but not as the primary planning interface.

① Gantt lanes

shift-board feel · collapses admin blocks · demand density overhead

Treats the day like a shift board. Time on x-axis, coaches as horizontal lanes, activities as contiguous bars (not 30-min chips). An overhead strip shows athlete-in-gym density as a filled area — the day's shape is obvious at a glance. Bottom strip shows max appointments available. Admin/huddle collapses into a single wide gray block with the time range inside.

Mondays in August 2025
4 observed · max scenario · 8:30 AM – 7 PM
Floor Apt Throw Huddle Admin
8:30a 9:30 10:30 11:30 12:30p 1:30 2:30 3:30 4:30 5:30 6:30 7:00
Athletes in gym
30 24
Coach 1 S1
Apt
Floor
H
Admin
Floor
off shift
Coach 2 S1
Apt
Thr
Floor
H
Admin
Thr
Floor
off shift
Coach 3 S1
Apt
Floor
Apt
H
Admin
Apt
Thr
Floor
off shift
Coach 4 S2
off shift
Floor
Apt
H
Admin
Apt
Thr
Floor
Fl
Coach 5 S2
off shift
Throw
Apt
H
Admin
Apt
Floor
Coach 6 S2
off shift
Apt
H
Admin
Apt
Flr
Apt
Ryan R
off
Fl
Apt
H
Admin
Apt
Thr
Apt
off
Max apts available
0 apts
Pros: Day's shape is immediately visible. Admin block is one wide object instead of 28 cells. Off-shift states obvious. Cons: Harder to show exact numbers (would need hover tooltips). 30-min precision loses a bit.

② Vertical calendar

time-on-y · coach columns · Google-Calendar reading pattern

Swap the axes: time going down, coaches across. Closer to how people read a calendar. Left sticky column carries the demand context so scanning "what's happening at 5 PM" is one horizontal read. Fits in viewport vertically without horizontal scroll.

Slot Demand C1 S1 C2 S1 C3 S1 C4 S2 C5 S2 C6 S2 Ryan R Max apts
Pros: No horizontal scroll, ever. Peak hours cluster visually. Demand mini-bar in-line per slot. Cons: Fewer columns (7 coaches fit easily) but if you add more coaches (say, summer interns = 10) it gets tight.

③ Time-block cards

narrative chunks · executive summary · click to expand

Break the day into operational blocks (morning sessions, midday admin, afternoon sessions, evening). Each block is a card with its own headline metric, coach-assignment summary grouped by activity, and the max apts available in that block. Click a card to expand to 30-min detail. Sells the story, not the spreadsheet.

Morning sessions
9:00 AM – 12:30 PM
7 slots · peak 30 in gym · 4 coaches on floor
13
Max apts across block
Floor: C1 C2 C3 C4 from 10 4 coaches at peak
Throw: C5 from 10 1 coach, 7 throwers
Apt: C6 from 10 Ryan from 9:30 2 slots throughout
Midday · Huddle + Admin
1:00 – 3:30 PM
5 slots · gym closed for training · 1 slot open for 1 apt
5
Max apts (1 per slot)
1:00 PM: All 7 coaches · Huddle
1:30 – 3:00: All 7 coaches · Admin 4 slots
One coach can step out for a 1:30 or 2 PM apt if needed.
Afternoon sessions
3:30 – 5:00 PM
3 slots · peak 24 in gym · 3 coaches on floor
12
Max apts
Floor: C1 C2 C3 4 PM
Throw: C2 3:30 C3 4 PM C4 4:30
Apt: C5 C6 Ryan 3 slots throughout
Evening
5 PM CRUNCH
5:00 – 7:00 PM
4 slots · Shift 1 leaves at 5 PM · Ryan until 6 PM
3
Max apts (1 slot at 0)
Floor: C4 C5 C6 5:30
Throw: Ryan 5:30
Apt: C6 6-7 PM Ryan 6-6:30
⚠ 5:30 PM slot: all 4 remaining coaches committed (3 floor + 1 throw). Zero apt availability.
Pros: Reads like a human narrative. Bad-news blocks (5 PM crunch) can be styled differently. Great for screenshotting one block at a time to Jason. Cons: Loses 30-min precision at the default zoom. Block boundaries become an editorial choice.

④ Density heatmap + sparklines

minimal text · color intensity encodes load · day-shape via sparklines

The lightest-weight option. Strips the text off the cells — each cell is just a colored square keyed by activity, intensity encodes athletes-per-slot (Floor darkness). Top and bottom sparklines show demand density and apt availability over the day. Hover any cell for the details; click a column for the slot inspector panel on the right.

Athletes in gym
Peak: 30 @ 10–11 AM
Coach 1
Coach 2
Coach 3
Coach 4
Coach 5
Coach 6
Ryan
Slot inspector
5:30 PM
Athletes/slot:6
In gym (90m):20
Coaches needed:3
Coaches allocated:4
Throwing coach:1
Max apts:0
5 PM Shift 1 departure + still-peaking gym = crunch.
Max apts avail
0
Peak: 5 @ 12:30 · Crunch: 5:30 PM
8:30a9:30 10:3011:30 12:30p1:30 2:303:30 4:305:30 6:307:00
Pros: Minimum ink. Day shape immediate from sparklines. Crunch moments jump out via the red bar. Inspector gives exact numbers on demand. Cons: Needs interaction to get specifics. Less self-contained as a static export. Activity labels hidden unless hover.