# Variance Charts

> Charts for actual versus plan, forecast, or prior - bullet charts, deviation bars, dumbbell and slope charts, variance bands, and small-multiple budget-vs-actual grids. Covers plotting the variance rather than two lines the reader must subtract, and encoding favourable-versus-unfavourable when direction and goodness disagree. Trigger on "actual vs budget", "BvA chart", "vs plan", "variance chart", "bullet chart", "target", "over/under", "compare to forecast", "gap to plan".

- Skill: `lukehle/variance-charts` (Agent Skill)
- Install (CLI): `npx skillmds@latest add lukehle/variance-charts`
- Raw SKILL.md: https://api.skillmd.com/api/skills/lukehle/variance-charts/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Finance & Business
- Author: Lukehle (https://skillmd.com/u/lukehle)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/lukehle/variance-charts

---


# Variance charts

The core principle, and it is violated constantly:

> **Plot the variance. Do not plot two lines and make the reader subtract.**

Two overlaid lines show that a gap exists. A variance chart shows how big it is, which direction, and
whether it is closing. The second is the question.

---

## Bullet chart — the default for actual vs target

Compact, precise, and it replaces both the gauge and the two-bar comparison.

```
Revenue     ▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░  │        $4.82M / $5.10M plan   (5.5%) under
Gross margin ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ │        76% / 75% plan          +1 pt
Net burn    ▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░  │        $412K / $455K plan      better
            └─ actual (bar)     └─ target (tick)
```

- **Bar is the actual, a perpendicular tick is the target.** The tick reads as a threshold; a second
  bar reads as a second value.
- Optional qualitative bands behind (poor / acceptable / good) — keep them very low contrast or they
  compete with the data.
- **One row per measure, stacked**, sharing an axis where the units allow. Where they do not, give
  each row its own normalized scale and label the values.
- Sort by variance magnitude, not alphabetically.

Bullet charts fit a dozen measures in the space of one gauge and add the comparison. There is no case
where a speedometer is the better choice.

---

## Deviation bars

One bar per line item, drawn from a zero line, length = variance.

Best when the question is *which items missed and by how much*.

- **Zero line is the plan**, not the axis edge.
- Sort by variance so the biggest misses are adjacent and readable.
- Label with **both absolute and percentage** — one alone misleads. $40K on a $50K line is a
  catastrophe; on a $4M line it is noise.
- Consider two panels: one sorted by absolute impact, one by percentage. They rank differently and
  both matter.

---

## Favourable versus unfavourable — the encoding trap

**Direction is not goodness.** Spend under budget is negative and good. Churn above plan is positive
and bad.

Decide which the colour encodes, then be consistent and say so:

| Approach | Use when |
|---|---|
| Colour = **goodness** (favourable/unfavourable) | Mixed measures on one chart — the usual case for a P&L variance view |
| Colour = **direction** (up/down) | Every measure on the chart shares a polarity |

Either way:
- **Sign or arrow carries the direction**; colour reinforces (`artifact-accessibility`).
- Label the legend explicitly — "green = favourable", not just a colour swatch.
- Never let a reader infer polarity from the chart alone.

A revenue miss and an expense saving are both "green is good" — but they point opposite ways on the
axis, and only an explicit legend prevents the misread.

---

## Variance bands on a time series

For actual versus plan over time, plot actual as a line and the plan as a band or a reference line,
shading the gap.

- Shade the gap area, colour-coded by favourability — the shaded area *is* the cumulative variance,
  which is more informative than either line.
- Mark the forecast boundary where actuals stop and projection begins. A solid line becoming dashed
  is the clearest convention.
- **Name the plan version**: "vs Plan (board approved 2026-01)". Plans get revised; an unlabelled
  "plan" is unreconcilable three months later.

---

## Dumbbell chart

Two dots joined by a line, one row per category. Excellent for **before/after** or **plan/actual**
across many categories.

- The line length is the variance and reads instantly.
- Sort by gap size.
- Consistent dot colours across all rows — plan always one colour, actual always the other.
- Better than a grouped bar chart above about six categories, because grouped bars force the eye to
  compare non-adjacent pairs.

---

## Slope chart

Two time points, one line per entity. Shows **rank change and rate of change** at once.

- Label both ends directly; no legend.
- Highlight the two or three entities that matter; grey the rest. A slope chart with 40 equally
  weighted lines is spaghetti.
- Best for "who moved" questions — segment mix shifts, customer ranking changes.

---

## Small-multiple BvA grid

One small panel per line item or department, each showing actual against plan over time.

- **Shared scale across every panel**, always. Per-panel scales make a department that missed by
  $2M look identical to one that missed by $20K.
- Sort panels by variance magnitude, not alphabetically.
- Keep panels small and dense — the pattern across panels is the point, not any single panel.
- One shared legend and one shared axis label, not per panel.

---

## What to avoid

| Anti-pattern | Why |
|---|---|
| Two overlaid lines with no variance shown | Makes the reader do arithmetic; the gap is the message |
| Grouped bars for actual/plan across many categories | Non-adjacent comparison; use dumbbell |
| Percentage variance with no absolute | 340% on a tiny base is noise |
| Colour alone for favourable/unfavourable | Fails greyscale and colourblind readers |
| Unlabelled plan version | Unreconcilable later |
| A gauge | Bullet chart, always |
| Truncated axis on an additive measure | Doubles the apparent miss |

---

## Related skills

- `chart-selection` — choosing among these
- `bridge-charts` — the budget-to-actual bridge, which explains *why* the variance exists
- `timeseries-finance` — the time dimension
- `chart-annotation` — naming the plan version and stating the finding
- `financial-tables` — the variance table that usually accompanies these

