Data Visualization for Dashboards
A dashboard is a tool for fast, accurate judgement under operational stress. Every visual choice supports that judgement
or undermines it.
Scope
- In scope: chart selection, encoding accuracy, color, layout and hierarchy, time-series conventions, observability
frameworks (RED, USE, Four Golden Signals, SLO/SLI), anti-patterns, review criteria.
- Out of scope:
- Grafana JSON, panel options, transformations, variables, library panels —
dashboards sibling owns mechanics.
- Alert rule definitions —
alerting sibling. This skill covers SLO/SLI dashboard structure, not rule firing.
- Query syntax —
promql / metricsql / logsql siblings.
References
- Perception and encoding — [
${CLAUDE_SKILL_DIR}/references/perception.md] Cleveland & McGill hierarchy,
pre-attentive attributes, Tufte data-ink and chart junk, Stephen Few counterpoint.
- Color — [
${CLAUDE_SKILL_DIR}/references/color.md] Semantic conventions, sequential/diverging/categorical
palettes, Viridis, colorblind safety, WCAG contrast, dark/light themes, Grafana scheme mapping.
- Layout — [
${CLAUDE_SKILL_DIR}/references/layout.md] F/Z patterns, tiering, grid discipline, progressive
disclosure, RED/USE/Four Golden Signals, SLO/SLI dashboard structure.
- Time-series specifics — [
${CLAUDE_SKILL_DIR}/references/time-series.md] Aspect ratio, baseline, interpolation,
aggregation, dual y-axes, stacking.
Encoding hierarchy
Cleveland & McGill (1984), most → least accurate:
- Position on a common scale
- Position on non-aligned scales (small multiples)
- Length (bar charts)
- Angle / slope (pie slices)
- Area (bubble plots, treemaps)
- Volume (3D)
- Color saturation / luminance
- Color hue (categorical only)
Pick encodings as high as the data shape allows. Color hue distinguishes categories; never magnitude.
Chart-type selection
Flows from data shape and the question being answered. dashboards skill has the panel-type catalog; this skill has the
rationale.
- Magnitudes over time → line chart (Time series). Default for observability metrics.
- Magnitudes across discrete categories → bar chart for ranking. Never pie.
- Parts of a whole → stacked bar or stacked area, ≤ 5 components, only when total is meaningful. No pie above 5.
- Distribution at a point in time → histogram. Over time, heatmap.
- One headline number → stat panel; sparkline when trend context matters.
- One value against a target → bar gauge over radial gauge. Radial only for single prominent numbers.
- Relationships between two metrics → scatter (XY chart).
- Tabular detail → table with sparkline cells for per-row trends.
- Status across many entities → state timeline or status history. Pair colored cells with text or icons.
Pie rule: if you must, ≤ 5 segments, parts-of-a-whole framing, meaningful total. Otherwise bar chart.
Pre-attentive attributes
Color hue, intensity, position, length, size, shape, orientation, motion — processed in under 200 ms. The unique
attribute "pops out" against the field.
- One pre-attentive attribute per signal. Combining collapses pop-out. If color encodes severity, don't reuse it for
category.
- Reserve motion for active anomalies. Decorative blinking trains viewers to ignore motion.
- Group with enclosure (rows, tabs) and proximity (grid), not panel borders.
Color rules
Color is redundant — pair with text, position, or shape.
- Fixed semantic mapping. Green = OK, amber = warning, red = critical, blue = informational, grey = no-data. One
mapping per dashboard. Reusing red for "high traffic" and "error rate" defeats the convention.
- Match palette to data:
- Sequential (single hue or Viridis) for magnitudes.
- Diverging (two ends, neutral middle) for anomalies around a baseline.
- Categorical (distinct hues, no order) for series identity. Cap at ~10 hues.
- Colorblind safety: 8% of men have color-vision deficiency. Avoid unmodified red-green as sole signal. Use
Viridis/Cividis for sequential data.
- Contrast: WCAG 4.5:1 for value text on stat panels. NOC TVs at half brightness amplify low-contrast failures.
- No rainbow scales. Perceptually non-uniform.
Grafana color scheme defaults
- Status panels (stat, gauge, bar gauge) →
From thresholds (by value). Base = green, amber warn, red crit.
- Multi-series time series →
Classic palette (by series name) — stable across reruns.
- Heatmap → sequential continuous (Blues / Greens) or Viridis-equivalent. Diverging only when zero/center is
operational.
- Non-status numeric metrics →
Single color. Position does the work.
Layout and information hierarchy
Users scan dashboards in F-pattern (horizontal sweeps, then vertical down the left) or Z-pattern (top-left →
top-right → bottom-left → bottom-right). Top-left has the highest attention; bottom-right the lowest.
Tier the dashboard
- Tier 1 — primary KPIs. Visible without scrolling. 2–4 panels max.
- Tier 2 — supporting trends and breakdowns.
- Tier 3 — drilldown, references, raw tables.
Aim for ≤ 12 panels in the initial viewport.
Grid discipline
- Pick a column unit and stick to it. 6, 8, or 12. Mixed widths in a row are noise.
- Match panel heights within a row. Mixed heights force the eye to re-anchor.
- Group with rows / tabs / collapsed sections, not decorative borders.
- Repeat panels and rows for symmetric per-entity dashboards.
Progressive disclosure
Headline → trend → breakdown → trace. Top answers "is this OK?" in under 3 seconds; lower tiers answer "why?" when
something is wrong. Use data links for drilldown preserving time range and variables (see dashboards skill,
annotations-links.md).
Time-series rules
- Aspect ratio: wider than tall, 2:1 to 4:1. Cleveland's "banking to 45°."
- Baseline:
- Zero for ratios, rates, counts, bounded fractions. Anywhere "twice as much" means something.
- Skip zero only for unbounded magnitudes where variation is the signal (temperature, stock prices).
- Never truncate silently — most common chart lie.
- Interpolation:
- Linear — default.
- Smooth (curved) — invents values between samples. Never on operational dashboards.
- Step before / after — discrete-state metrics (queue depth, feature flag, node count).
- Bars — closed-bucket aggregates (requests-per-minute), not continuous samples.
- Aggregation:
max for latency, queue depth — preserves spikes.
avg for throughput — shows typical level.
- Overlay both when in doubt.
$__rate_interval inside Prometheus rate() (4× scrape-interval rule).
- Dual y-axes:
- OK for correlated signals on shared time axis (req rate + latency during incidents).
- Anti-pattern for unrelated metrics or scale-mismatched signals — split panels or normalize.
- Stacking:
- Default unstacked.
- Stack only when components sum to a meaningful total and user needs both total and breakdown.
- Non-bottom series read against non-flat baseline — magnitudes noisy.
Observability frameworks
- Four Golden Signals (Google SRE) — Latency, Traffic, Errors, Saturation. User-facing services.
- RED (Tom Wilkie) — Rate, Errors, Duration. Request-driven services (HTTP/gRPC). Golden Signals minus
saturation; better for bursty workloads.
- USE (Brendan Gregg) — Utilization, Saturation, Errors. Resources (hosts, disks, queues).
Pick by entity:
- Customer-facing service → Four Golden Signals or RED.
- Resource → USE.
- Platform overview → mix: Golden Signals on top, USE per resource tier below.
SLO/SLI dashboards
- SLI current value — large stat, threshold = SLO target. Green ≥ target, red below.
- Error budget remaining —
1 - (1 - SLI) / (1 - SLO) as %. Red near zero.
- Burn rate —
current_failure_rate / budget_failure_rate. > 1 burns budget faster than allowed.
- SLO compliance over time — SLI series with SLO target as threshold line.
- Burn-down chart — remaining budget over SLO window (typically 28d).
- Multi-window burn-rate alert state — short/long-window burn signals from alert system.
Layout: SLO summary stats top tier. SLO trend + burn-down middle tier. Failure-mode breakdown bottom tier.
Dashboard review checklist
- Purpose — Can a new on-call describe the dashboard in one sentence?
- Headline visible without scrolling? 3-second "is this OK?" answer in initial viewport.
- Hierarchy — Do size, position, and color emphasis agree?
- Encoding hierarchy — Every magnitude encoded as high as shape allows?
- Units set everywhere? No bare numbers.
- Color — Consistent semantic mapping? Stable categorical palette (
by series name)? No rainbow sequential?
- Baseline — Zero on rates/ratios/counts? Truncation marked?
- Interpolation — Linear or step? No smooth curves?
- Time range — Default matches dashboard purpose (24h ops, 28d SLO)?
- Drilldown — Data links preserve time range and variables?
- Chart junk — Decoration without information removed?
- Repeating panels and rows for entity symmetry?
- Time-window consistency — All panels controlled by dashboard time picker?
Application
When designing:
- Start from the question the dashboard answers, not the metrics you have.
- Pick framework (RED, USE, Four Golden Signals, SLO) before panels.
- Tier panels: ≤ 4 headline KPIs, then trends, then breakdowns.
- Apply encoding hierarchy: position > length > angle > area > color.
- Lock semantic color mapping for the whole dashboard.
- Default to unstacked, linear-interpolation, zero-baseline time series.
When reviewing:
- Cite the panel and rule. Show the fix.
- Distinguish "wrong" from "stylistic preference."
- Point and fix; don't lecture.
Integration
dashboards — Grafana mechanics. This skill picks position-not-angle; that skill sets the scheme.
alerting — rule definitions. This skill structures SLO/SLI dashboards that visualize burn.
promql / metricsql / logsql — query syntax. This skill assumes correct queries.
Critical rules
- Position and length carry magnitude. Color hue carries category. Never confuse them.
- Color is redundant — pair semantic color with text, position, or shape.
- Zero baseline for rates, ratios, counts. Never silently truncate.
- Linear or step interpolation on operational dashboards. Smooth curves invent data.
- Default unstacked. Stack only when the total matters.
- Dual y-axes only for correlated signals.
- Top-left is the headline. 3-second "is this OK?" without scrolling.
- One pre-attentive attribute per signal.
- No rainbow palettes, no 3D, no decorative thresholds, no pie above 5 segments.
1---2name: dataviz3description: Data visualization discipline for monitoring and observability dashboards: chart-type selection by data shape, encoding accuracy hierarchy (position > length > angle > area > color), pre-attentive attributes, Tufte data-ink, color theory (semantic conventions, Viridis, colorblind safety), dashboard layout and information hierarchy (F/Z-pattern, tiering), time-series conventions (baseline, interpolation, dual axes, stacking), observability frameworks (RED, USE, Four Golden Signals, SLO/SLI). Invoke whenever task involves any interaction with dashboard design quality — making a good dashboard, reviewing a visualization, picking a chart type, dashboard layout, color choices, panel arrangement, or critiquing existing observability dashboards.4---56# Data Visualization for Dashboards78A dashboard is a tool for fast, accurate judgement under operational stress. Every visual choice supports that judgement9or undermines it.1011## Scope1213- **In scope:** chart selection, encoding accuracy, color, layout and hierarchy, time-series conventions, observability14 frameworks (RED, USE, Four Golden Signals, SLO/SLI), anti-patterns, review criteria.15- **Out of scope:**16 - **Grafana JSON, panel options, transformations, variables, library panels** — `dashboards` sibling owns mechanics.17 - **Alert rule definitions** — `alerting` sibling. This skill covers SLO/SLI dashboard structure, not rule firing.18 - **Query syntax** — `promql` / `metricsql` / `logsql` siblings.1920## References2122- **Perception and encoding** — [`${CLAUDE_SKILL_DIR}/references/perception.md`] Cleveland & McGill hierarchy,23 pre-attentive attributes, Tufte data-ink and chart junk, Stephen Few counterpoint.24- **Color** — [`${CLAUDE_SKILL_DIR}/references/color.md`] Semantic conventions, sequential/diverging/categorical25 palettes, Viridis, colorblind safety, WCAG contrast, dark/light themes, Grafana scheme mapping.26- **Layout** — [`${CLAUDE_SKILL_DIR}/references/layout.md`] F/Z patterns, tiering, grid discipline, progressive27 disclosure, RED/USE/Four Golden Signals, SLO/SLI dashboard structure.28- **Time-series specifics** — [`${CLAUDE_SKILL_DIR}/references/time-series.md`] Aspect ratio, baseline, interpolation,29 aggregation, dual y-axes, stacking.3031## Encoding hierarchy3233Cleveland & McGill (1984), most → least accurate:34351. Position on a common scale362. Position on non-aligned scales (small multiples)373. Length (bar charts)384. Angle / slope (pie slices)395. Area (bubble plots, treemaps)406. Volume (3D)417. Color saturation / luminance428. Color hue (categorical only)4344**Pick encodings as high as the data shape allows.** Color hue distinguishes categories; never magnitude.4546## Chart-type selection4748Flows from data shape and the question being answered. `dashboards` skill has the panel-type catalog; this skill has the49rationale.5051- **Magnitudes over time** → line chart (Time series). Default for observability metrics.52- **Magnitudes across discrete categories** → bar chart for ranking. Never pie.53- **Parts of a whole** → stacked bar or stacked area, ≤ 5 components, only when total is meaningful. No pie above 5.54- **Distribution at a point in time** → histogram. Over time, **heatmap**.55- **One headline number** → stat panel; sparkline when trend context matters.56- **One value against a target** → bar gauge over radial gauge. Radial only for single prominent numbers.57- **Relationships between two metrics** → scatter (XY chart).58- **Tabular detail** → table with sparkline cells for per-row trends.59- **Status across many entities** → state timeline or status history. Pair colored cells with text or icons.6061**Pie rule:** if you must, ≤ 5 segments, parts-of-a-whole framing, meaningful total. Otherwise bar chart.6263## Pre-attentive attributes6465Color hue, intensity, position, length, size, shape, orientation, motion — processed in under 200 ms. The unique66attribute "pops out" against the field.6768- **One pre-attentive attribute per signal.** Combining collapses pop-out. If color encodes severity, don't reuse it for69 category.70- **Reserve motion for active anomalies.** Decorative blinking trains viewers to ignore motion.71- **Group with enclosure (rows, tabs) and proximity (grid)**, not panel borders.7273## Color rules7475Color is redundant — pair with text, position, or shape.7677- **Fixed semantic mapping.** Green = OK, amber = warning, red = critical, blue = informational, grey = no-data. One78 mapping per dashboard. Reusing red for "high traffic" and "error rate" defeats the convention.79- **Match palette to data:**80 - Sequential (single hue or Viridis) for magnitudes.81 - Diverging (two ends, neutral middle) for anomalies around a baseline.82 - Categorical (distinct hues, no order) for series identity. Cap at ~10 hues.83- **Colorblind safety:** 8% of men have color-vision deficiency. Avoid unmodified red-green as sole signal. Use84 Viridis/Cividis for sequential data.85- **Contrast:** WCAG 4.5:1 for value text on stat panels. NOC TVs at half brightness amplify low-contrast failures.86- **No rainbow scales.** Perceptually non-uniform.8788### Grafana color scheme defaults8990- **Status panels (stat, gauge, bar gauge)** → `From thresholds (by value)`. `Base = green`, amber warn, red crit.91- **Multi-series time series** → `Classic palette (by series name)` — stable across reruns.92- **Heatmap** → sequential continuous (Blues / Greens) or Viridis-equivalent. Diverging only when zero/center is93 operational.94- **Non-status numeric metrics** → `Single color`. Position does the work.9596## Layout and information hierarchy9798Users scan dashboards in **F-pattern** (horizontal sweeps, then vertical down the left) or **Z-pattern** (top-left →99top-right → bottom-left → bottom-right). Top-left has the highest attention; bottom-right the lowest.100101### Tier the dashboard102103- **Tier 1** — primary KPIs. Visible without scrolling. 2–4 panels max.104- **Tier 2** — supporting trends and breakdowns.105- **Tier 3** — drilldown, references, raw tables.106107Aim for ≤ 12 panels in the initial viewport.108109### Grid discipline110111- **Pick a column unit and stick to it.** 6, 8, or 12. Mixed widths in a row are noise.112- **Match panel heights within a row.** Mixed heights force the eye to re-anchor.113- **Group with rows / tabs / collapsed sections**, not decorative borders.114- **Repeat panels and rows** for symmetric per-entity dashboards.115116### Progressive disclosure117118Headline → trend → breakdown → trace. Top answers "is this OK?" in under 3 seconds; lower tiers answer "why?" when119something is wrong. Use data links for drilldown preserving time range and variables (see `dashboards` skill,120`annotations-links.md`).121122## Time-series rules123124- **Aspect ratio:** wider than tall, 2:1 to 4:1. Cleveland's "banking to 45°."125- **Baseline:**126 - **Zero** for ratios, rates, counts, bounded fractions. Anywhere "twice as much" means something.127 - **Skip zero** only for unbounded magnitudes where variation is the signal (temperature, stock prices).128 - **Never truncate silently** — most common chart lie.129- **Interpolation:**130 - **Linear** — default.131 - **Smooth (curved)** — invents values between samples. Never on operational dashboards.132 - **Step before / after** — discrete-state metrics (queue depth, feature flag, node count).133 - **Bars** — closed-bucket aggregates (requests-per-minute), not continuous samples.134- **Aggregation:**135 - `max` for latency, queue depth — preserves spikes.136 - `avg` for throughput — shows typical level.137 - Overlay both when in doubt.138 - `$__rate_interval` inside Prometheus `rate()` (4× scrape-interval rule).139- **Dual y-axes:**140 - **OK** for correlated signals on shared time axis (req rate + latency during incidents).141 - **Anti-pattern** for unrelated metrics or scale-mismatched signals — split panels or normalize.142- **Stacking:**143 - Default **unstacked**.144 - Stack only when components sum to a meaningful total and user needs both total and breakdown.145 - Non-bottom series read against non-flat baseline — magnitudes noisy.146147## Observability frameworks148149- **Four Golden Signals (Google SRE)** — Latency, Traffic, Errors, Saturation. **User-facing services.**150- **RED (Tom Wilkie)** — Rate, Errors, Duration. **Request-driven services** (HTTP/gRPC). Golden Signals minus151 saturation; better for bursty workloads.152- **USE (Brendan Gregg)** — Utilization, Saturation, Errors. **Resources** (hosts, disks, queues).153154Pick by entity:155156- Customer-facing service → Four Golden Signals or RED.157- Resource → USE.158- Platform overview → mix: Golden Signals on top, USE per resource tier below.159160## SLO/SLI dashboards161162- **SLI current value** — large stat, threshold = SLO target. Green ≥ target, red below.163- **Error budget remaining** — `1 - (1 - SLI) / (1 - SLO)` as %. Red near zero.164- **Burn rate** — `current_failure_rate / budget_failure_rate`. > 1 burns budget faster than allowed.165- **SLO compliance over time** — SLI series with SLO target as threshold line.166- **Burn-down chart** — remaining budget over SLO window (typically 28d).167- **Multi-window burn-rate alert state** — short/long-window burn signals from alert system.168169**Layout:** SLO summary stats top tier. SLO trend + burn-down middle tier. Failure-mode breakdown bottom tier.170171## Dashboard review checklist1721731. **Purpose** — Can a new on-call describe the dashboard in one sentence?1742. **Headline visible without scrolling?** 3-second "is this OK?" answer in initial viewport.1753. **Hierarchy** — Do size, position, and color emphasis agree?1764. **Encoding hierarchy** — Every magnitude encoded as high as shape allows?1775. **Units set everywhere?** No bare numbers.1786. **Color** — Consistent semantic mapping? Stable categorical palette (`by series name`)? No rainbow sequential?1797. **Baseline** — Zero on rates/ratios/counts? Truncation marked?1808. **Interpolation** — Linear or step? No smooth curves?1819. **Time range** — Default matches dashboard purpose (24h ops, 28d SLO)?18210. **Drilldown** — Data links preserve time range and variables?18311. **Chart junk** — Decoration without information removed?18412. **Repeating panels and rows** for entity symmetry?18513. **Time-window consistency** — All panels controlled by dashboard time picker?186187## Application188189When **designing**:190191- Start from the question the dashboard answers, not the metrics you have.192- Pick framework (RED, USE, Four Golden Signals, SLO) before panels.193- Tier panels: ≤ 4 headline KPIs, then trends, then breakdowns.194- Apply encoding hierarchy: position > length > angle > area > color.195- Lock semantic color mapping for the whole dashboard.196- Default to unstacked, linear-interpolation, zero-baseline time series.197198When **reviewing**:199200- Cite the panel and rule. Show the fix.201- Distinguish "wrong" from "stylistic preference."202- Point and fix; don't lecture.203204## Integration205206- **`dashboards`** — Grafana mechanics. This skill picks position-not-angle; that skill sets the scheme.207- **`alerting`** — rule definitions. This skill structures SLO/SLI dashboards that visualize burn.208- **`promql` / `metricsql` / `logsql`** — query syntax. This skill assumes correct queries.209210## Critical rules211212- **Position and length carry magnitude. Color hue carries category. Never confuse them.**213- **Color is redundant — pair semantic color with text, position, or shape.**214- **Zero baseline for rates, ratios, counts. Never silently truncate.**215- **Linear or step interpolation on operational dashboards. Smooth curves invent data.**216- **Default unstacked. Stack only when the total matters.**217- **Dual y-axes only for correlated signals.**218- **Top-left is the headline. 3-second "is this OK?" without scrolling.**219- **One pre-attentive attribute per signal.**220- **No rainbow palettes, no 3D, no decorative thresholds, no pie above 5 segments.**