Radar charts
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. |
| 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
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.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.
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-lineaxis query "Query power" icon=lucide:searchaxis ops "Ease of running" icon=lucide:settingsaxis cost "Cost" better=down icon=lucide:coinsaxis tx "Transactions" icon=lucide:lock
series pg "PostgreSQL" tone=blue : 3, 5, 3, 2, 5series dyn "DynamoDB" tone=orange : 5, 2, 5, 3, 3series mongo "MongoDB" tone=green : 4, 3, 4, 3, 3Axes, 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.
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:containeraxis tf "Terraform" icon=lucide:layersaxis obs "Observability" icon=lucide:activityaxis sec "Security" icon=lucide:shieldaxis go "Go" icon=lucide:codeaxis oncall "Incident response" icon=lucide:sirenseries ana "Ana" : 4, 3, 2, 3, 4, 3series ben "Ben" : 2, 4, 3, 2, 3, 2series cara "Cara" : 3, 2, 4, 3, 2, 4series dev "Dev" : 1, 3, 3, 4, 2, 3Axes, 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.
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, 1series after "After" tone=green : 4, 3, 4, 4, 4, 3Axes, 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 or a quadrant chart 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. |
| 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 covers the converter in full.
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 0The converter writes one line for each axis and each curve, and puts the keyed scores in axis order:
radar "Restaurant Comparison" max=5axis food "Food Quality"axis service "Service"axis price "Price"axis ambiance "Ambiance"series a "Restaurant A" : 4, 3, 2, 4series b "Restaurant B" : 3, 4, 3, 3series 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 | The rules every kind shares |
| Examples to copy | Finished diagrams with the prompt that gets an agent to write each one |
| Migrating from Mermaid | Convert existing Mermaid diagrams, and what is dropped |
| Matrices | The same comparison as a table of scores |
| Quadrant charts | Items placed on two axes |
| Language reference | Every kind, option and diagnostic |