# Ridgeline

> A joy plot: one overlapping ridge per category over a shared axis, so every shape reads at once

Canonical: https://ext.tableauops.com/knowledge/kit/ridgeline
Updated: 2026-09-18
Author: Eric Summers

One filled area **ridge** per category, offset vertically and overlapped so the shape of a
measure across a shared x-axis reads for every category at once. Each ridge's height at an
x-position is the **aggregated measure** summed per (category x x). It is taken straight from
the worksheet, not a density estimate: the marks are already pre-aggregated, so there are no
raw observations left to run a KDE over. A per-render peak scales every ridge to one shared
amplitude unit, and an opaque crest stroke tops each translucent body so overlapping ridges
stay legible.

## Encodings

| Tile | Role | Max | What it drives |
|---|---|---|---|
| **Category** | dimension(s) | 8 | One ridge per distinct value (or combination). Its order sets which ridge sits at which baseline. Unbound Color also colors ridges by this. The selection key. **Required.** A dimension on the built-in **Detail** tile joins this key. |
| **X Axis** | any | 1 | The shared horizontal axis. Each distinct raw value is one x-position, ordered by **raw** value; the axis runs from the data's first to last value. A date part, a binned measure, or an ordinal dimension. A *continuous measure* here collapses each category to one point (the empty state says to bin it or use a date part). **Required.** |
| **Height** | continuous measure | 1 | The ridge amplitude at each x-position, summed per (category x x). Rows with a null measure are skipped. **Required.** |
| **Color** | any | 1 | *Optional.* A numeric measure gives a sequential ramp (tint to accent). A dimension or date gives the muted palette, and it **splits** marks (the color value joins the aggregation + selection key). Unbound, each ridge takes its own palette swatch by category. |

## Configure

Open with the gear (top-right of the viz). Live preview; **Done** closes, **Cancel** reverts.

- **Appearance:** accent color, theme (light/dark), mark size.
- **Order:** ridge order top-to-bottom (auto / largest / smallest / A to Z / as loaded), which also sets the vertical offset.
- **Ridge shape:** **Overlap** (0 to 100%, how far each ridge rises into the one above; default 45%), **Line smoothing** (off / subtle / smooth, cosmetic outline only with values untouched), **Fill opacity** (so stacked bodies stay readable; the crest is always opaque).
- **Outliers:** amplitude scaling (keep all / exclude gentle at the 98th pct / exclude strong at the 95th pct). Caps the shared amplitude scale so one giant peak doesn't flatten the rest; taller points clip to the crest, no data is removed.
- **X axis:** date bucket (auto / day / week, Sunday-floored) for a raw date on X. Selection is by category, never by x, so bucketing X is always safe.
- **Numeric color:** the ramp ends when a measure is on Color.
- The **interaction toggle** (default on): clicking a ridge selects that category's marks.

## Interact

Click a ridge and its category's marks are selected across all x-positions, so dashboard
**Filter / Highlight actions** fire and cross-filter the other sheets. Click the same ridge
again, or empty canvas, to clear. Non-selected ridges dim to grey. Hover shows the category,
the x-value under the cursor, that ridge's height there, and the color value. Push-only (it
does not react to selections made elsewhere).

## Caps

- **READ_CAP = 100,000** rows, checked before the first page; over it the chart reads nothing
  and says so (filter, or use a coarser x field).
- **RIDGE_CAP = 50** ridges (legibility): the largest-total categories are kept.
- **MAX_MARKS = 4,000** points across all ridges: the smallest-total ridges drop first.

Every trim writes a note in the bottom-right corner. Nothing is truncated silently.

## What's different from the kit starter

- Two-level aggregation: per ridge (category key), then per x-position within it. The
  starter totals one value per mark.
- Height is **not** density-estimated; it is the pre-aggregated measure per x-position.
- Adds the shared-x renderer, three caps (READ_CAP / RIDGE_CAP / MAX_MARKS), the overlap,
  smoothing, fill-opacity, outlier-amplitude and x-bucket config, and a standalone demo.

## Get it

Ridgeline ships in the Extension Kit ($59). See it live on the [demo gallery](/kit/demo/ridgeline).


---
Try it live: See it live — https://ext.tableauops.com/kit/demo/ridgeline
