elements
Demos UI Feed Discuss Install
Style System
  • Style
  • Themes
  • Behaviors
Forms
  • Button
  • ButtonGroup
  • Checkbox
  • ColorPicker
  • Combobox
  • Field
  • FileUpload
  • Input
  • InputGroup
  • InputOTP
  • Label
  • NativeSelect
  • NumberInput
  • PasswordInput
  • RadioGroup
  • Select
  • Slider
  • Switch
  • TagsInput
  • Textarea
  • Toggle
  • ToggleGroup
Overlays
  • AlertDialog
  • Command
  • ContextMenu
  • Dialog
  • Drawer
  • DropdownMenu
  • HoverCard
  • Menubar
  • NavigationMenu
  • Popover
  • Sheet
  • Toast
  • Tooltip
Display
  • Accordion
  • Alert
  • AspectRatio
  • Avatar
  • Badge
  • Breadcrumb
  • Card
  • Collapsible
  • Empty
  • Item
  • Kbd
  • Pagination
  • Progress
  • Separator
  • Skeleton
  • Spinner
  • Table
  • Tabs
  • Tree
Layout
  • Carousel
  • Resizable
  • ScrollArea
  • Sidebar
Dates
  • Calendar
  • DatePicker
  • DateRangePicker
  • TimePicker
Data
  • AreaChart
  • BarChart
  • Chart
  • DataTable
  • Kanban
  • LineChart
  • PieChart
  • RadarChart
  • RadialChart
  • VirtualList
Chat
  • Attachment
  • Message
  • MessageList
  • PromptInput
Elements UI / Data / RadarChart

RadarChart

Values on radial axes, one polygon per series, over a polygon or circle grid.

Default

One series as a filled polygon over a polygon grid.

Radar Chart

Showing total visitors for the last 6 months

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Trending up by 5.2% this month
January - June 2024
Code
<RadarChart data={rows} config={{ desktop: { label: "Desktop", color: "var(--chart-1)" } }}
            x="month" tooltip={{ cursor: false }} />

Usage

import { RadarChart } from "@elements/ui/chart-radar";
import type { ChartConfig } from "@elements/ui/chart";

<RadarChart data={rows} {config} x="month" />
<RadarChart data={rows} {config} x="month" grid={{ type: "circle" }} dots legend />

Examples

Dots

A dot on every vertex.

Radar Chart - Dots

Showing total visitors for the last 6 months

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<RadarChart data={rows} config={{ desktop }} x="month" dots={{ r: 4 }} tooltip={{ cursor: false }} />

Lines only

lines strokes each polygon; fillOpacity 0 leaves it hollow.

Radar Chart - Lines Only

Showing total visitors for the last 6 months

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktopMobile
January18680
February305200
March237120
April73190
May209130
June214140
Code
<RadarChart data={rows} {config} x="month" lines fillOpacity={0}
            grid={{ radialLines: false }} tooltip={{ indicator: "line", cursor: false }} />

Custom label

angleAxis detail puts both values over each month.

Radar Chart - Custom Label

Showing total visitors for the last 6 months

186/80January305/200February237/120March73/190April209/130May214/140June
Radar chart
MonthDesktopMobile
January18680
February305200
March237120
April73190
May209130
June214140
Code
<RadarChart data={rows} {config} x="month" margin={{ top: 10, right: 10, bottom: 10, left: 10 }}
            angleAxis={{ detail: (row) => `${row.desktop}/${row.mobile}` }}
            tooltip={{ indicator: "line", cursor: false }} />

Grid custom

One ring at a fixed radius and no spokes.

Radar Chart - Grid Custom

Showing total visitors for the last 6 months

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<RadarChart data={rows} config={{ desktop }} x="month"
            grid={{ radialLines: false, radii: [90] }} tooltip={{ hideLabel: true, cursor: false }} />

Grid none

grid=false.

Radar Chart - Grid None

Showing total visitors for the last 6 months

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<RadarChart data={rows} config={{ desktop }} x="month" grid={false} dots={{ r: 4 }} />

Grid circle

grid type=circle.

Radar Chart - Grid Circle

Showing total visitors for the last 6 months

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<RadarChart data={rows} config={{ desktop }} x="month" grid={{ type: "circle" }} dots={{ r: 4 }} />

Grid circle, no lines

Circles without spokes.

Radar Chart - Grid Circle No Lines

Showing total visitors for the last 6 months

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<RadarChart data={rows} config={{ desktop }} x="month"
            grid={{ type: "circle", radialLines: false }} dots={{ r: 4 }} />

Grid circle filled

Circles washed in the series color.

Radar Chart - Grid Circle Filled

Showing total visitors for the last 6 months

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<RadarChart data={rows} config={{ desktop }} x="month"
            grid={{ type: "circle", fill: true }} fillOpacity={0.5} />

Grid filled

Polygons washed in the series color.

Radar Chart - Grid Filled

Showing total visitors for the last 6 months

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<RadarChart data={rows} config={{ desktop }} x="month" grid={{ fill: true }} fillOpacity={0.5} />

Multiple

Every series in the config, one polygon each.

Radar Chart - Multiple

Showing total visitors for the last 6 months

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktopMobile
January18680
February305200
March237120
April73190
May209130
June214140
Code
<RadarChart data={rows} {config} x="month" tooltip={{ indicator: "line", cursor: false }} />

Legend

A legend under the plot.

Radar Chart - Legend

Showing total visitors for the last 6 months

JanuaryFebruaryMarchAprilMayJune
  • Desktop
  • Mobile
Radar chart
MonthDesktopMobile
January18680
February305200
March237120
April73190
May209130
June214140
Code
<RadarChart data={rows} {config} x="month" legend tooltip={{ indicator: "line", cursor: false }} />

Icons

Config icons in the legend and tooltip.

Radar Chart - Icons

Showing total visitors for the last 6 months

JanuaryFebruaryMarchAprilMayJune
  • Desktop
  • Mobile
Radar chart
MonthDesktopMobile
January18680
February305200
March237120
April73190
May209130
June214140
Code
<RadarChart data={rows} config={{ desktop: { ..., icon: "monitor" }, mobile: { ..., icon: "smartphone" } }}
            x="month" legend tooltip={{ indicator: "line", cursor: false }} />

Radius axis

Value ticks along one spoke; no category labels.

Radar Chart - Radius Axis

Showing total visitors for the last 6 months

80160240320
Radar chart
MonthDesktopMobile
January18680
February305200
March237120
April73190
May209130
June214140
Code
<RadarChart data={rows} {config} x="month" angleAxis={false}
            radiusAxis={{ angle: 60, orientation: "middle" }} tooltip={{ indicator: "line", labelKey: "month" }} />

Labels

The value at each vertex, outside the polygon.

18630523773209214JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<!-- each value just outside its vertex -->
<RadarChart data={rows} {config} x="month" series={["desktop"]} labels dots />

Missing values

A month with no value breaks the polygon; connectNulls closes it over that spoke.

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktop
January186
February305
March
April73
May209
June214
JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktop
January186
February305
March
April73
May209
June214
Code
<!-- March has no value: the polygon breaks there, or connectNulls closes it over the spoke -->
<RadarChart data={gaps} {config} x="month" series={["desktop"]} lines />
<RadarChart data={gaps} {config} x="month" series={["desktop"]} lines connectNulls />

Range

A low and a high value per month fill the band between two polygons.

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthRange
January62 – 186
February140 – 305
March110 – 237
April40 – 173
May90 – 209
June120 – 214
Code
<!-- a [low, high] pair per month draws the band between them -->
const ranges = [{ month: "January", temperature: [12, 24] }, ...];
<RadarChart data={ranges} {config} x="month" />

Radius and angle axis options

radiusAxis ticks fixes the tick values and the grid rings; allowDecimals false keeps nice ticks whole; reversed puts the largest value at the center. angleAxis reversed runs the spokes counter-clockwise.

JanFebMarAprMayJun100250
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
SpeedRangePowerFocusGrip1234
Radar chart
SkillDesktop
Speed3
Range2
Power1
Focus3
Grip2
JanFebMarAprMayJun080160240
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<!-- ticks fixes the values; the grid rings follow them -->
<RadarChart data={rows} {config} x="month" radiusAxis={{ angle: 0, ticks: [100, 250] }} />
<!-- allowDecimals false keeps the ticks on whole numbers -->
<RadarChart data={scores} {config} x="skill" radiusAxis={{ angle: 0, allowDecimals: false }} />
<!-- reversed: the largest value at the center; the spokes run counter-clockwise -->
<RadarChart data={rows} {config} x="month" radiusAxis={{ angle: 0, reversed: true }} angleAxis={{ reversed: true }} />

Center and margin

cx and cy place the center as px or a percentage of the plot inside the margin; the grid and axes follow it.

JanFebMarAprMayJun
Radar chart
MonthDesktopMobile
January18680
February305200
March237120
April73190
May209130
June214140
Code
<RadarChart data={rows} {config} x="month"
            margin={{ left: 40 }} cx="40%" cy="60%" />

Animation timing

animation sets when the marks start moving, how long they take and their easing: a CSS easing name, a cubic-bezier, spring, or a function of progress.

JanFebMarAprMayJun
Radar chart
MonthDesktopMobile
January18680
February305200
March237120
April73190
May209130
June214140
Code
<!-- wait 150ms, then take 900ms to enter or move to new data -->
<RadarChart data={rows} {config} x="month"
            animation={{ begin: 150, duration: 900, easing: (t) => t * t }} />

Legend and tooltip types

legendType on a config entry sets that series' legend icon, and none leaves a drawn series out of the legend; tooltipType none leaves it out of the tooltip.

JanFebMarAprMayJun
  • Desktop
  • Mobile
Radar chart
MonthDesktopMobileOther
January1868045
February305200100
March237120150
April7319050
May209130100
June214140160
Code
<!-- desktop's legend icon is a line; mobile is left out of the tooltip, other out of the legend -->
<RadarChart data={rows} x="month" legend config={{
  desktop: { label: "Desktop", color: "var(--chart-1)", legendType: "line" },
  mobile: { label: "Mobile", color: "var(--chart-2)", tooltipType: "none" },
  other: { label: "Other", color: "var(--chart-3)", legendType: "none" },
}} />

Toggles, keyboard and table

Tab to the chart, arrows move around the spokes; the legend hides series; the table shows the data. The radius axis is fixed at 0 to 400 with three ticks toward three o'clock.

JanFebMarAprMayJun200+400+
Radar chart
MonthDesktopMobile
January18680
February305200
March237120
April73190
May209130
June214140
active: -1 changes: 0 clicked: -1 hidden: none
Code
<RadarChart data={rows} {config} x="month" legend={{ toggle: true }} hidden={state.hidden}
            radiusAxis={{ angle: 0, tickCount: 3, domain: [0, 400], tickFormatter: (v) => `${v}+` }}
            active={state.active} onActiveChange={() => state.changes++}
            onItemClick={(i) => state.clicked = i} />

Polar axes

innerRadius starts the value scale and the rings away from the center; polarAngles places the spokes; the axes draw lines, tick marks and titles; a second radius or angle axis gives a series its own scale or spoke order.

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
JanFebMarAprMayJun200400VisitsCount
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
JanFebMarAprMayJun2004005001,000
Radar chart
MonthDesktopMobile
January18680
February305200
March237120
April73190
May209130
June214140
JanFebMarAprMayJun
Radar chart
MonthDesktopMobile
January18680
February305200
March237120
April73190
May209130
June214140
Code
<RadarChart data={rows} config={{ desktop }} x="month" innerRadius={30} />
<RadarChart data={rows} config={{ desktop }} x="month"
            grid={{ polarAngles: [90, 0, 270, 180] }}
            angleAxis={{ axisLine: true, axisLineType: "circle", tickLine: true, label: "Visits" }}
            radiusAxis={{ angle: 30, axisLine: true, tickLine: true, label: "Count" }} />
<!-- two radius axes: mobile has a scale of its own -->
<RadarChart data={rows} {config} x="month"
            radiusAxis={[{ angle: 90 }, { angle: 270, series: ["mobile"], domain: [0, 1000] }]} />
<!-- two angle axes: mobile runs its spokes the other way -->
<RadarChart data={rows} {config} x="month"
            angleAxis={[{}, { series: ["mobile"], reversed: true, hide: true }]} />

Grid style

grid stroke, strokeDasharray and strokeWidth restyle the rings and spokes.

JanuaryFebruaryMarchAprilMayJune
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<!-- the rings and spokes in the first chart color, dashed, 2px -->
<RadarChart data={rows} {config} x="month"
            grid={{ stroke: "var(--chart-1)", strokeDasharray: "3 3", strokeWidth: 2 }} />

Radius axis options

unit follows each value in the tooltip; orientation sets the ticks beside their spoke; allowDataOverflow keeps a domain the data runs past; includeHidden keeps a hidden series in the scale; angleAxis angle turns the category labels.

JanuaryFebruaryMarchAprilMayJune80160240320
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
JanuaryFebruaryMarchAprilMayJune80160240320
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
JanuaryFebruaryMarchAprilMayJune50100150200
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
JanuaryFebruaryMarchAprilMayJune80160240320
Radar chart
MonthDesktopMobile
January18680
February305200
March237120
April73190
May209130
June214140
JanFebMarAprMayJun
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<!-- unit follows each value in the tooltip -->
<RadarChart data={rows} {config} x="month" radiusAxis={{ angle: 0, unit: "k" }} />
<!-- the ticks beside the spoke, ending at their value -->
<RadarChart data={rows} {config} x="month" radiusAxis={{ angle: 90, orientation: "left" }} />
<!-- keep 0 to 200 though February reaches 305 -->
<RadarChart data={rows} {config} x="month" radiusAxis={{ angle: 0, domain: [0, 200], allowDataOverflow: true }} />
<!-- hiding a series keeps the scale -->
<RadarChart data={rows} {config} x="month" legend={{ toggle: true }}
            radiusAxis={{ angle: 0, includeHidden: true }} />
<!-- each month label turned 45 degrees -->
<RadarChart data={rows} {config} x="month" angleAxis={{ angle: 45 }} />

Radius scale

niceTicks none ends the radius axis at the data; scale picks a square root or log scale; type category gives each distinct value a ring of its own; range sets the radii the axis spans.

JanuaryFebruaryMarchAprilMayJune76.25152.5228.75305
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
JanuaryFebruaryMarchAprilMayJune80160240320
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
JanuaryFebruaryMarchAprilMayJune18630523773209214
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
JanuaryFebruaryMarchAprilMayJune80160240320
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<!-- the axis ends at the data's own maximum, ticks evenly spaced -->
<RadarChart data={rows} {config} x="month" radiusAxis={{ angle: 0, niceTicks: "none" }} />
<!-- a square root scale: small values spread out -->
<RadarChart data={rows} {config} x="month" radiusAxis={{ angle: 0, scale: "sqrt" }} />
<!-- each distinct value on a ring of its own, in data order -->
<RadarChart data={rows} {config} x="month" radiusAxis={{ angle: 0, type: "category" }} />
<!-- the axis spans 20 to 60px from the center -->
<RadarChart data={rows} {config} x="month" radiusAxis={{ angle: 0, range: [20, 60] }} />

Radial layout

layout radial gives each category a ring from the center out and each value a share of the turn, the value ticks round the rim.

JanFebMarAprMayJun80160240320
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<!-- a ring per month from the center out, each value a share of the turn from twelve o'clock -->
<RadarChart data={rows} {config} x="month" layout="radial" radiusAxis dots />

Moving to new data

animation matchBy pairs old and new items by a key, so each month slides to its new place; interpolate draws every frame with a function of your own, here one that starts each point after the one before.

JanFebMarAprMayJun
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
JanFebMarAprMayJun
Radar chart
MonthDesktop
January186
February305
March237
April73
May209
June214
Code
<!-- each month keeps its point: the window slides instead of every point changing value -->
<RadarChart data={rows} {config} x="month" animation={{ matchBy: matchByDataKey("month") }} />
<!-- (items, t) => the items to draw: each matched item from prev to next, started one after another -->
<RadarChart data={rows} {config} x="month" animation={{ interpolate: stagger }} />
Reference RadarChart in the manual Every part, attribute, slot, key and data attribute.
Prev PieChartNext RadialChart
Product
Manual Pricing Compare
Company
History Contact
Legal
Privacy Policy Acceptable Use Terms License Agreement
© Elements Dev Corporation 2026