coord.polar, just like pie & donut — but here the category sweeps around the circle instead of the value.
With theta: 'x', each category takes a spoke and its value grows outward along the radius. The geom then sets the shape: geom.line() traces a radar, geom.area() fills it, geom.bar() draws a rose.
With theta: 'y', the value sweeps the angle instead, and each category becomes its own concentric track — a radial bar.
They read best for a small, fixed set of categories compared across a few series — a skills profile, a weekly cycle, activity by hour.
Radar
A radar (or spider) chart is ageom.line() under coord.polar({ theta: 'x' }). Map the axis category to x, the value to y, and a series column to color.
Two scale settings keep it readable: a discrete x scale gives each category an evenly-spaced spoke, and zero: true on y anchors the centre at zero so the radius stays proportional to the value. A non-interactive geom.point() layer marks each vertex:
Filled radar
Swap the line forgeom.area({ position: 'identity' }) to fill each series polygon. Keep position: 'identity' so the areas overlap at their true values rather than stacking; the vertex points still sit on top:
Rose / coxcomb
A rose (or coxcomb) chart keepstheta: 'x' but draws bars instead of a line: each category is an angular wedge and the value sets how far the wedge reaches. Map a series to color and pick a position — dodge splits each wedge into side-by-side petals, stack grows the series outward along the radius:
Radial bar
A radial bar (or race-track) chart flips the angle back to the value withtheta: 'y': each category becomes its own concentric ring and the value sweeps around it. An innerRadius opens up the centre so the innermost track isn’t crushed into a point. Stack a series to read each ring as consecutive coloured segments:
Related
- Coordinate systems — the polar plane,
thetaandinnerRadius - Pie & donut — the
theta: 'y'parts-of-a-whole family - Chart types overview — geoms, positions and the full recipe list

