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.