Uncertainty charts
A single forecast line is a claim of certainty that no forecast supports. The reader takes the number
off the chart, quotes it, and the range that mattered is gone.
The purpose of every chart here is to keep the range visible.
Fan chart — forecast with widening uncertainty
Actuals as a solid line; from the forecast boundary, nested bands of increasing width.
╱▒▒▒▒▒
╱▒▒▒▓▓▓▓▓▓
────────────────●═══════════╱▒▓▓███████████████
╲▒▒▒▓▓▓▓▓▓▓▓
╲▒▒▒▒▒▒
actuals forecast →
- Bands widen with horizon. A constant-width band implies uncertainty does not grow with time,
which is false for every business forecast.
- Two or three bands, not five. Typically a central case plus one or two ranges. More bands read
as precision about imprecision.
- Label what the bands mean — and be honest. If they are scenario judgements rather than
statistical intervals, call them "scenario range", not "80% confidence". Dressing judgement in
statistical language is the most common dishonesty in forecast charts.
- Central line dashed past the boundary; solid for actuals.
- Do not extend bands beyond where you have a view. A 5-year fan from a 12-month model is
decoration.
Scenario bands — discrete cases
When you have named scenarios rather than a distribution:
- Three lines: base, upside, downside. Shade between them.
- Name and define each scenario in the chart, not in an appendix: "Downside: no Q4 enterprise
deals, hiring freeze".
- The base case is visually dominant; upside and downside are lighter. Three equally weighted
lines make the reader hunt for which one is the plan.
- Mark the decision-relevant threshold — the zero-cash line, the covenant, the plan number. What
the reader wants is not the range but whether the range crosses something that matters.
For runway specifically, that threshold crossing is the whole chart: show when each scenario hits
zero cash, as a date.
Tornado — which input matters
Horizontal bars, one per input, showing output range as that input varies across its plausible range,
sorted by width. The widest at the top gives the shape.
Churn rate ██████████████████████ -18% ─── +14%
Price increase ████████████ -9% ─── +11%
Hiring pace ██████ -5% ─── +4%
Hosting cost ███ -2% ─── +2%
- Centre on the base case. The bar is the deviation from base, not the absolute.
- Vary each input across a defensible range and state it. "Churn 4-9%" is a claim; unstated
ranges make the whole chart arbitrary — a tornado can be made to say anything by choosing ranges.
- One input at a time, held all else constant. Say so; real inputs correlate, and the chart does
not capture that.
- Label both ends with the actual output values, not just percentages.
This is the single most useful chart for prioritising which assumption to go and get better data on.
Monte Carlo output
Do not show the spaghetti of every simulated path. It looks impressive and communicates nothing.
Show instead:
- A histogram or density of the outcome with the key percentiles marked (P10 / P50 / P90).
- The probability of crossing a threshold — "68% of runs reach the plan number", "22% of runs hit
zero cash before the raise". This is what a decision-maker actually needs.
- A cumulative distribution when the question is "what is the chance we are at least X".
- The number of runs, and the model vintage.
Do not report a mean without its spread. A mean of a skewed distribution — which most financial
outcomes are — is not the expected experience.
Box plots and distributions
For spread across a population — deal sizes, days-to-collect, contract lengths.
- Box plots are dense and precise, but many finance audiences will not read them. Label the
quartiles directly, or use a dot strip with the median marked instead.
- Always show
n. A box on 6 observations is not a distribution.
- Overlay individual points when
n is small (under ~40); the box alone hides that it is six dots.
- For aging or bucketed data, a histogram is more natural and needs no explanation.
The honesty rules
These are what separate a useful uncertainty chart from a misleading one:
| Rule |
Why |
| Never present a scenario range as a statistical confidence interval |
They are different claims; conflating them borrows credibility the model has not earned |
| State the assumptions on the chart |
An unstated assumption set makes the range unfalsifiable |
| Do not extend a forecast beyond the model's horizon |
The bands stop meaning anything |
| Show the base case distinctly |
Otherwise the reader picks whichever line suits them |
| Round to the model's precision |
A P50 to the dollar from a model with ±20% inputs is theatre |
| Date the forecast vintage |
Forecasts get revised; an undated one cannot be reconciled |
| Mark the decision threshold |
The range only matters relative to something |
What to avoid
- A single forecast line with no range, unless the horizon is short and the mechanism certain.
- Symmetric bands where risk is asymmetric. Cash runway is usually asymmetric — things go wrong
faster than they go right. Symmetric bands understate downside.
- Error bars on a bar chart where the bars are already near the axis limit — the whiskers get
clipped and the range is lost.
- Confidence language on judgemental scenarios.
- Spaghetti plots of simulation paths.
Related skills
timeseries-finance — the forecast boundary and vintage labelling
chart-selection — when uncertainty needs its own view
chart-annotation — stating assumptions and thresholds on the chart
ui-antipatterns — false precision
1---2name: uncertainty-charts3description: Visualizing forecast uncertainty, scenarios, and sensitivity - fan charts, scenario bands, tornado diagrams, Monte Carlo output, box plots, and the discipline of not implying more confidence than the model supports. Trigger on "forecast", "scenario", "uncertainty", "confidence interval", "fan chart", "sensitivity", "tornado", "Monte Carlo", "best case worst case", "range of outcomes", "what if".4---56# Uncertainty charts78A single forecast line is a claim of certainty that no forecast supports. The reader takes the number9off the chart, quotes it, and the range that mattered is gone.1011The purpose of every chart here is to keep the range visible.1213---1415## Fan chart — forecast with widening uncertainty1617Actuals as a solid line; from the forecast boundary, nested bands of increasing width.1819```20 ╱▒▒▒▒▒21 ╱▒▒▒▓▓▓▓▓▓22 ────────────────●═══════════╱▒▓▓███████████████23 ╲▒▒▒▓▓▓▓▓▓▓▓24 ╲▒▒▒▒▒▒25 actuals forecast →26```2728- **Bands widen with horizon.** A constant-width band implies uncertainty does not grow with time,29 which is false for every business forecast.30- **Two or three bands, not five.** Typically a central case plus one or two ranges. More bands read31 as precision about imprecision.32- **Label what the bands mean** — and be honest. If they are scenario judgements rather than33 statistical intervals, call them "scenario range", not "80% confidence". Dressing judgement in34 statistical language is the most common dishonesty in forecast charts.35- **Central line dashed** past the boundary; solid for actuals.36- **Do not extend bands beyond where you have a view.** A 5-year fan from a 12-month model is37 decoration.3839---4041## Scenario bands — discrete cases4243When you have named scenarios rather than a distribution:4445- **Three lines: base, upside, downside.** Shade between them.46- **Name and define each scenario in the chart**, not in an appendix: "Downside: no Q4 enterprise47 deals, hiring freeze".48- **The base case is visually dominant**; upside and downside are lighter. Three equally weighted49 lines make the reader hunt for which one is the plan.50- **Mark the decision-relevant threshold** — the zero-cash line, the covenant, the plan number. What51 the reader wants is not the range but whether the range crosses something that matters.5253For runway specifically, that threshold crossing is the whole chart: show when each scenario hits54zero cash, as a **date**.5556---5758## Tornado — which input matters5960Horizontal bars, one per input, showing output range as that input varies across its plausible range,61sorted by width. The widest at the top gives the shape.6263```64Churn rate ██████████████████████ -18% ─── +14%65Price increase ████████████ -9% ─── +11%66Hiring pace ██████ -5% ─── +4%67Hosting cost ███ -2% ─── +2%68```6970- **Centre on the base case.** The bar is the deviation from base, not the absolute.71- **Vary each input across a defensible range** and state it. "Churn 4-9%" is a claim; unstated72 ranges make the whole chart arbitrary — a tornado can be made to say anything by choosing ranges.73- **One input at a time**, held all else constant. Say so; real inputs correlate, and the chart does74 not capture that.75- Label both ends with the actual output values, not just percentages.7677This is the single most useful chart for prioritising which assumption to go and get better data on.7879---8081## Monte Carlo output8283Do not show the spaghetti of every simulated path. It looks impressive and communicates nothing.8485Show instead:8687- **A histogram or density of the outcome** with the key percentiles marked (P10 / P50 / P90).88- **The probability of crossing a threshold** — "68% of runs reach the plan number", "22% of runs hit89 zero cash before the raise". This is what a decision-maker actually needs.90- **A cumulative distribution** when the question is "what is the chance we are at least X".91- The number of runs, and the model vintage.9293**Do not report a mean without its spread.** A mean of a skewed distribution — which most financial94outcomes are — is not the expected experience.9596---9798## Box plots and distributions99100For spread across a population — deal sizes, days-to-collect, contract lengths.101102- Box plots are dense and precise, but **many finance audiences will not read them**. Label the103 quartiles directly, or use a dot strip with the median marked instead.104- **Always show `n`.** A box on 6 observations is not a distribution.105- Overlay individual points when `n` is small (under ~40); the box alone hides that it is six dots.106- For aging or bucketed data, a **histogram is more natural** and needs no explanation.107108---109110## The honesty rules111112These are what separate a useful uncertainty chart from a misleading one:113114| Rule | Why |115|---|---|116| **Never present a scenario range as a statistical confidence interval** | They are different claims; conflating them borrows credibility the model has not earned |117| **State the assumptions on the chart** | An unstated assumption set makes the range unfalsifiable |118| **Do not extend a forecast beyond the model's horizon** | The bands stop meaning anything |119| **Show the base case distinctly** | Otherwise the reader picks whichever line suits them |120| **Round to the model's precision** | A P50 to the dollar from a model with ±20% inputs is theatre |121| **Date the forecast vintage** | Forecasts get revised; an undated one cannot be reconciled |122| **Mark the decision threshold** | The range only matters relative to something |123124---125126## What to avoid127128- **A single forecast line with no range**, unless the horizon is short and the mechanism certain.129- **Symmetric bands where risk is asymmetric.** Cash runway is usually asymmetric — things go wrong130 faster than they go right. Symmetric bands understate downside.131- **Error bars on a bar chart** where the bars are already near the axis limit — the whiskers get132 clipped and the range is lost.133- **Confidence language on judgemental scenarios.**134- **Spaghetti plots** of simulation paths.135136---137138## Related skills139140- `timeseries-finance` — the forecast boundary and vintage labelling141- `chart-selection` — when uncertainty needs its own view142- `chart-annotation` — stating assumptions and thresholds on the chart143- `ui-antipatterns` — false precision