/

Polar Chart

Plot data in polar coordinates with area, line, or bar representations arranged around a central point.

NNEESESSWWNW

Quick Start

import { PolarChart } from "@chartts/react"
 
const data = [
  { skill: "Frontend", level: 90 },
  { skill: "Backend", level: 75 },
  { skill: "DevOps", level: 60 },
  { skill: "Design", level: 45 },
  { skill: "Data", level: 70 },
  { skill: "Mobile", level: 55 },
]
 
export function SkillProfile() {
  return (
    <PolarChart
      data={data}
      value="level"
      label="skill"
      type="area"
      fill
      fillOpacity={0.3}
      className="h-80 w-80"
    />
  )
}

When to Use Polar Charts

Polar charts map data around a central point, with each category occupying an equal angular slice. They work best for cyclical data and multi-axis comparisons.

Use a polar chart when:

  • Comparing multiple categories radiating from a center (skill assessments, performance metrics)
  • Showing cyclical patterns (monthly data, time of day, compass directions)
  • You want a visually distinctive alternative to bar charts for 5-12 categories
  • Displaying ratings or scores across several dimensions

Don't use a polar chart when:

  • Precise comparison between values matters (angular position distorts perception)
  • You have fewer than 4 categories (looks sparse)
  • You have more than 12 categories (becomes cluttered)
  • Your audience is unfamiliar with polar layouts (use a standard bar chart)

Props Reference

PropTypeDefaultDescription
dataT[]requiredArray of data objects
valuekeyof TrequiredKey for the numeric values
labelkeyof TrequiredKey for category labels around the perimeter
type'area' | 'line' | 'bar''area'Visual style for data representation
startAnglenumber0Starting angle in degrees (0 is top)
gridLevelsnumber5Number of concentric grid rings
showGridbooleantrueDisplay the background grid
colorsstring[]paletteColors for the data series
fillbooleantrueFill the area enclosed by the data shape
fillOpacitynumber0.2Opacity of the filled area (0 to 1)
animatebooleantrueEnable draw-in animation
classNamestring-Tailwind classes on root SVG

Area, Line, and Bar in Polar Coordinates

The type prop controls how data points render around the polar axis:

// Area (default) - filled polygon connecting data points
<PolarChart data={data} value="score" label="category" type="area" />
 
// Line - unfilled polygon outline
<PolarChart data={data} value="score" label="category" type="line" />
 
// Bar - radial bars extending from center
<PolarChart data={data} value="score" label="category" type="bar" />

Area and line types connect adjacent points to form a polygon. Bar type renders individual wedges from the center, similar to a radial bar chart.


Grid Levels

The concentric rings in the background provide a reference scale. Control how many rings appear:

// Fewer grid lines for a cleaner look
<PolarChart
  data={data}
  value="rating"
  label="criterion"
  gridLevels={3}
/>
 
// More grid lines for precise reading
<PolarChart
  data={data}
  value="rating"
  label="criterion"
  gridLevels={10}
/>
 
// No grid
<PolarChart
  data={data}
  value="rating"
  label="criterion"
  showGrid={false}
/>

Grid levels are evenly spaced from 0 to the maximum value. Each ring is labeled with its value.


Start Angle Configuration

By default, the first category starts at the top (0 degrees). Rotate the chart to change where the first category appears:

// Start from the right (90 degrees)
<PolarChart
  data={data}
  value="value"
  label="month"
  startAngle={90}
/>
 
// Start from the bottom (180 degrees)
<PolarChart
  data={data}
  value="value"
  label="month"
  startAngle={180}
/>

This is particularly useful for time-based data where you want a specific month or hour at the top.


Fill Opacity

Control how transparent the filled area is. Lower opacity lets the grid show through; higher opacity adds visual weight:

// Very transparent
<PolarChart
  data={data}
  value="score"
  label="skill"
  fill
  fillOpacity={0.1}
/>
 
// Semi-transparent (good for overlapping series)
<PolarChart
  data={data}
  value="score"
  label="skill"
  fill
  fillOpacity={0.3}
/>
 
// No fill, outline only
<PolarChart
  data={data}
  value="score"
  label="skill"
  fill={false}
/>

Accessibility

  • Each data point has an aria-label with the category name and value
  • The chart includes a summary description of the overall shape
  • Keyboard navigation moves between points around the perimeter
  • Screen readers announce values in clockwise order starting from the top

Real-World Examples

Product evaluation matrix

<PolarChart
  data={productScores}
  value="score"
  label="criterion"
  type="area"
  fill
  fillOpacity={0.25}
  colors={["#6366f1"]}
  gridLevels={5}
  className="h-80 w-80"
/>

Monthly sales pattern

<PolarChart
  data={monthlySales}
  value="revenue"
  label="month"
  type="bar"
  colors={["#06b6d4"]}
  showGrid
  gridLevels={4}
  className="h-96 w-96"
/>

Athlete performance profile

<PolarChart
  data={athleteStats}
  value="rating"
  label="attribute"
  type="area"
  fill
  fillOpacity={0.2}
  colors={["#10b981"]}
  startAngle={0}
  gridLevels={5}
  className="h-80 w-80"
/>

Other Charts