Installation
Theme
Mode

Data viz

Radar

A spider chart for comparing a few things across the same set of dimensions. Each axis is one metric; each coloured polygon is one subject — so shape, not just height, tells the story of where something is strong or weak. Toggle series in the legend to compare cleanly.

$npx shadcn@latest add @orbit/radar-chart

Overview

Live — hover a legend chip to bring one series forward, or click it to hide that series and compare the rest.

Sprint health — this vs. last vs. target
Sprint health
Six dimensions, scored 0–5 — this vs. last vs. target

Capabilities

A radar turns a row of numbers into a silhouette, so two subjects can be told apart at a glance by their profile.

Many axes, one view
Six or eight metrics share one frame, so a subject’s whole profile reads as a single shape rather than a table of numbers.
Overlaid comparison
Stack this sprint over last over target. Where the polygons diverge is exactly where attention is needed.
Toggle & isolate
Click a legend chip to drop a series; hover to bring one forward and dim the rest for an uncluttered read.
Shared scale
Every axis runs 0–5 from the same centre, so distance from the middle always means the same thing.

Options

Any shared scale works — set max to the axis ceiling. Colors default to the fixed CHART_SERIES palette by position, and interactiveLegend=false swaps the toggle chips for the family’s plain legend row.

max=100 — percentage scale, default palette
interactiveLegend=false — static legend row
Team ATeam B

Props

PropTypeDefaultDescription
axesstring[]Axis labels, clockwise from 12 o’clock. 3–8 axes read best.
series{ id?: string; name: string; values: number[]; color?: string }[]One polygon per series; values map to axes by index and clamp to [0, max]. Colors default to CHART_SERIES by position.
maxnumber5Shared axis maximum. Every axis runs 0..max from the centre.
levelsnumber5Number of polygon grid rings.
heightnumber420Total height in px, legend included. Width is responsive.
showLegendbooleantrueLegend row under the plot. Never rendered for one series.
interactiveLegendbooleantruePill chips that toggle (click) and isolate (hover) series; false renders a plain static legend.
showTooltipbooleantrueDark tooltip listing every visible series at the hovered axis.
formatValue(v: number) => stringStringFormats tooltip values.
ariaLabelstringPlain-language summary for the chart’s role=“img”.
…restHTMLAttributes<HTMLDivElement>Forwarded to the root div, including ref and className.

Usage

Radar is best for 3–8 axes and 1–3 series on a shared, meaningful scale. More of either and the overlaps become unreadable.

Do

Normalise the axes

Put every metric on a common 0–N scale. Mixing raw units (days, %, count) makes the shape meaningless.

Don’t

Overlay too many series

One to three polygons stay legible. Four or more overlapping fills turn into mud — use small multiples instead.

Do

Order axes intentionally

Related dimensions side by side make the shape readable. A random axis order produces a meaningless silhouette.

Don’t

Compare absolute areas

Radar area scales with the square of values and depends on axis order — read each axis, don’t eyeball total area.

Keyboard & accessibility

The chart renders as a labelled image; the legend chips are keyboard-operable buttons, and hiding a series never recolors the rest.

roleimg with an aria-label summary of the comparison
LegendReal buttons with aria-pressed and a focus ring
TooltipEvery visible series at the hovered axis
ContrastSeries palette holds ≥ 3:1 on both modes