# Radar charts

> Page: https://docs.plotwork.dev/radar-charts. Index of every page: https://docs.plotwork.dev/llms.txt

A radar chart scores a few items on the same three or more axes and draws each item as a shape round a centre, so the reader sees at once where each one is strong and where it is weak. Use it to compare options against criteria, to map a team's skills, or to show a maturity assessment before and after. It is for anyone choosing between a few options, and for an agent asked to compare them.

## TL;DR

| Question | Answer |
|---|---|
| What is it for? | A few items scored on the same criteria: databases on scale and cost, people on skills, a practice on maturity. |
| How do I start one? | Write `radar "Title" max=5`, one `axis` line for each criterion, and one `series` line for each item with a score per axis. |
| How is a score written? | `series pg "PostgreSQL" : 3, 5, 2` in the order of the axes, or `: scale=3, query=5, cost=2` by axis id. Scores run from `min=` (default 0) to `max=`. |
| What does Mermaid convert? | `radar-beta`: axes, curves in order or by axis, and the settings. See [From Mermaid](#from-mermaid). |
| How big can it be? | 3 to 16 axes and at most 12 series. Warnings start at 10 axes or 5 series. |
| How is it drawn? | A plate with rings and spokes, one shape per item with a light wash of its tone and a dot at each score, a label outside each spoke, and a legend. |

## Ask your agent

```text
Use Plotwork to draw a radar chart comparing PostgreSQL, DynamoDB and MongoDB for the orders service, scored 0 to 5 on scale, query power, ease of running, cost and transactions. Lower cost is better.
```

```text
Use Plotwork to draw a radar chart of my team's skills: Kubernetes, Terraform, observability, security, Go and incident response, each person rated 0 to 4.
```

## Example

Three databases scored on five criteria. Cost is marked `better=down`, so its label says that a lower score is better, and the outline counts it that way when it names each database's strongest and weakest axes.

**Diagram source**

```diagram
radar "Database options" min=0 max=5 desc="Three databases scored from 0 to 5 on five criteria for the orders service. PostgreSQL is strongest overall, DynamoDB scales best and is the easiest to run."

axis scale "Scale" icon=lucide:chart-line
axis query "Query power" icon=lucide:search
axis ops "Ease of running" icon=lucide:settings
axis cost "Cost" better=down icon=lucide:coins
axis tx "Transactions" icon=lucide:lock

series pg "PostgreSQL" tone=blue : 3, 5, 3, 2, 5
series dyn "DynamoDB" tone=orange : 5, 2, 5, 3, 3
series mongo "MongoDB" tone=green : 4, 3, 4, 3, 3
```

*Picture: Database options: 3 series on 5 axes, from 0 to 5. Three databases scored from 0 to 5 on five criteria for the orders service. PostgreSQL is strongest overall, DynamoDB scales best and is the easiest to run.*

**Text description**

**Axes, clockwise from the top: Scale, Query power, Ease of running, Cost (lower is better), Transactions.**

- PostgreSQL: Scale 3, Query power 5, Ease of running 3, Cost 2, Transactions 5; strongest on Query power and Transactions (5), weakest on Scale, Ease of running and Cost (3, 2).
- DynamoDB: Scale 5, Query power 2, Ease of running 5, Cost 3, Transactions 3; strongest on Scale and Ease of running (5), weakest on Query power and Cost (2, 3).
- MongoDB: Scale 4, Query power 3, Ease of running 4, Cost 3, Transactions 3; strongest on Scale and Ease of running (4), weakest on Cost (3).

### Team skills

With `rings=4`, a team rated 0 to 4 gets one ring a level. Past five people the shapes are hard to tell apart, so draw one chart per squad.

**Diagram source**

```diagram
radar "Platform team skills" rings=4 unit="level" desc="Four engineers rated from 0 to 4 on the skills the platform team needs."
axis k8s "Kubernetes" icon=lucide:container
axis tf "Terraform" icon=lucide:layers
axis obs "Observability" icon=lucide:activity
axis sec "Security" icon=lucide:shield
axis go "Go" icon=lucide:code
axis oncall "Incident response" icon=lucide:siren
series ana "Ana" : 4, 3, 2, 3, 4, 3
series ben "Ben" : 2, 4, 3, 2, 3, 2
series cara "Cara" : 3, 2, 4, 3, 2, 4
series dev "Dev" : 1, 3, 3, 4, 2, 3
```

*Picture: Platform team skills: 4 series on 6 axes, from 0 to 4 level. Four engineers rated from 0 to 4 on the skills the platform team needs.*

**Text description**

**Axes, clockwise from the top: Kubernetes, Terraform, Observability, Security, Go, Incident response.**

- Ana: Kubernetes 4, Terraform 3, Observability 2, Security 3, Go 4, Incident response 3; strongest on Kubernetes and Go (4), weakest on Observability (2).
- Ben: Kubernetes 2, Terraform 4, Observability 3, Security 2, Go 3, Incident response 2; strongest on Terraform (4), weakest on Kubernetes, Security and Incident response (2).
- Cara: Kubernetes 3, Terraform 2, Observability 4, Security 3, Go 2, Incident response 4; strongest on Observability and Incident response (4), weakest on Terraform and Go (2).
- Dev: Kubernetes 1, Terraform 3, Observability 3, Security 4, Go 2, Incident response 3; strongest on Security (4), weakest on Kubernetes (1).

### A maturity assessment

Before and after on one chart: the grey shape is last year, the green one this year, and `min=1` puts the lowest level at the centre.

**Diagram source**

```diagram
radar "Delivery maturity" min=1 max=5 grid=circle desc="How the delivery practice scored before and after a year of work, from 1 (initial) to 5 (optimised)."
axis build "Build and integration"
axis test "Test automation"
axis release "Release"
axis deploy "Deployment"
axis monitor "Monitoring and alerts"
axis infra "Infrastructure as code"
series before "Before" tone=neutral : 2, 1, 2, 2, 3, 1
series after "After" tone=green : 4, 3, 4, 4, 4, 3
```

*Picture: Delivery maturity: 2 series on 6 axes, from 1 to 5. How the delivery practice scored before and after a year of work, from 1 (initial) to 5 (optimised).*

**Text description**

**Axes, clockwise from the top: Build and integration, Test automation, Release, Deployment, Monitoring and alerts, Infrastructure as code.**

- Before: Build and integration 2, Test automation 1, Release 2, Deployment 2, Monitoring and alerts 3, Infrastructure as code 1; strongest on Monitoring and alerts (3), weakest on Test automation and Infrastructure as code (1).
- After: Build and integration 4, Test automation 3, Release 4, Deployment 4, Monitoring and alerts 4, Infrastructure as code 3; strongest on Build and integration, Release, Deployment and Monitoring and alerts (4), weakest on Test automation and Infrastructure as code (3).

## The language

### The header

`radar "Title"` starts the chart. Every option is optional.

| Option | Values | Default | Meaning |
|---|---|---|---|
| `min=` | a number | `0` | The score at the centre. A number below zero goes in quotes: `min="-10"`. |
| `max=` | a number | the largest score, rounded up | The score at the outer ring. |
| `grid=` | `polygon`, `circle` | `polygon` | How the rings are drawn. |
| `rings=` | `2` to `10` | one a score for a short whole scale, else a round step | How many rings divide the scale. |
| `legend=` | `on`, `off` | on for two or more series | The legend under the chart. |
| `values=` | `on`, `off` | `off` | Writes each score by its dot. |
| `unit=` | text | none | Written after the number of the outer ring. |
| `desc=` | text | none | The plain-language description, for assistive technology. |

### Statements

| Statement | Meaning | Example |
|---|---|---|
| `axis <id> "<Label>"` | A spoke. The first points up and the rest follow clockwise. The label is optional; the id is used when it is left out. | `axis cost "Cost" better=down` |
| `series <id> "<Label>" : <scores>` | An item and its scores. | `series pg "PostgreSQL" : 3, 5, 2` |
| `desc "<text>"` | The plain-language description, the same as `desc=`. | `desc "Three databases."` |

### Axes

An axis takes `icon=`, drawn before its label, and `better=down` for a criterion where a lower score is better, such as a price or a latency. `better=down` adds "lower is better" under the label; the scores are drawn as written, so a cheap option sits near the centre on that spoke. A chart needs at least three axes: with two, an [XY chart](https://docs.plotwork.dev/xy-charts.md) or a [quadrant chart](https://docs.plotwork.dev/quadrant-charts.md) reads better.

### Series

Write the scores in the order the axes are written, `: 3, 5, 2`, or name each one by its axis id, `: cost=2, scale=3, query=5`, which reads better when there are many axes. Every axis gets a score. A series may come before the axes it scores. `tone=` chooses its colour; series with none take blue, orange, aqua, violet, amber, green, red and grey in turn.

### Scale, grid and rings

Each score lies along its spoke by its share of the scale from `min=` to `max=`. A score outside the scale is an error that names the series and the axis. With no `max=`, a short scale ends at the next whole score (a team rated up to 4 tops out at 4) and a longer one at the next round number (87 tops out at 100). The ring numbers sit halfway between the first two spokes, where no dot lies.

## Limits and warnings

| Limit | What happens |
|---|---|
| Fewer than 3 axes | Refused with `E100`. |
| More than 16 axes or 12 series | Refused with `E140` before any layout. |
| More than 10 axes or 5 series | `W200`: a reader cannot tell the shapes apart. Split the items, or compare them in a [matrix](https://docs.plotwork.dev/matrices.md). |
| A series at the minimum on every axis | `W200`: it is a dot at the centre, usually scores not filled in. |
| Axis labels that touch | `W200`: shorten them, or use fewer axes. |
| A label cut to fit | `W203`. The full text stays in the text description. |

## From Mermaid

Mermaid `radar-beta` converts to a radar chart. Ask your agent to convert it, or use the `convert_mermaid` tool. The [migration guide](https://docs.plotwork.dev/migrating-from-mermaid.md) covers the converter in full.

```mermaid-source
radar-beta
  title Restaurant Comparison
  axis food["Food Quality"], service["Service"], price["Price"]
  axis ambiance["Ambiance"]
  curve a["Restaurant A"]{4, 3, 2, 4}
  curve b["Restaurant B"]{3, 4, 3, 3}
  curve c{ food: 2, service: 3, price: 4, ambiance: 2 }
  max 5
  min 0
```

The converter writes one line for each axis and each curve, and puts the keyed scores in axis order:

```plotwork
radar "Restaurant Comparison" max=5
axis food "Food Quality"
axis service "Service"
axis price "Price"
axis ambiance "Ambiance"
series a "Restaurant A" : 4, 3, 2, 4
series b "Restaurant B" : 3, 4, 3, 3
series c : 2, 3, 4, 2
```

| Mermaid | Plotwork | Report |
|---|---|---|
| `radar-beta`, `radar` | `radar "<title>"` | none |
| `title X`, front matter `title:` | The header title | none |
| `axis a["A"], b["B"]` | One `axis a "A"` line each | none |
| `curve c["L"]{1, 2, 3}` | `series c "L" : 1, 2, 3` | none |
| `curve c{ x: 3, y: 2 }` | The scores in axis order | none |
| `max`, `min` | `max=`, `min=` | none |
| `graticule`, `showLegend false` | `grid=`, `legend=off` | none |
| `ticks` | `rings=`, kept from 2 to 10 | `M204` when moved |
| Too few or too many scores, or a keyed score missing | Padded with the minimum, or cut | `M204` |
| A keyed score on an axis that does not exist | Dropped | `M203` |
| A score outside `min` to `max` | Moved to the nearest end | `M204` |
| A second axis or curve of the same id | Dropped | `M209` |
| An id that is not a Plotwork id | Renamed | `M206` |
| `axisScaleFactor`, `curveTension`, theme colours | Dropped | `M200` |
| Fewer than three axes | Nothing is converted. | `M110` |
| A chart with no curves | Nothing is converted. | `M103` |

## See also

| Doc | Why |
|---|---|
| [Writing diagrams](https://docs.plotwork.dev/writing-diagrams.md) | The rules every kind shares |
| [Examples to copy](https://docs.plotwork.dev/examples.md) | Finished diagrams with the prompt that gets an agent to write each one |
| [Migrating from Mermaid](https://docs.plotwork.dev/migrating-from-mermaid.md) | Convert existing Mermaid diagrams, and what is dropped |
| [Matrices](https://docs.plotwork.dev/matrices.md) | The same comparison as a table of scores |
| [Quadrant charts](https://docs.plotwork.dev/quadrant-charts.md) | Items placed on two axes |
| [Language reference](https://docs.plotwork.dev/reference/language.md) | Every kind, option and diagnostic |
