Charts /
CH-SPA-02
CH-SPA-02 . family SPA
PROPORTIONAL SYMBOL MAP
area-true circles at supplied coordinates over a base map. Needs: base polygons + places [{name, at, value}]; absolute counts.
magnitudecomparison
Use when
- absolute counts anchored to places (stock, headcount, backlog)
- comparing site magnitudes in their geographic context
Do not use when
- rates (symbol size reads as amount)
- more than ~10 symbols
See instead
Alternatives
- CH-SPA-01 (rates)
- CH-MAG-05 (no geography)
Rules
- AREA encodes the value, never radius
- every symbol labeled with name and value
- base map stays a quiet single tint
Never do this
- radius scaling
- colored base regions competing with symbols
- unlabeled symbols
QA before delivering
- area-true
- labels on symbols
- highlight <= 1
- source present
Data shape
| title | action title with a number |
| source | bottom-left always |
| unit | on first place |
| note | coordinates are author-supplied unit-square (0-100) geometry; the renderer scales, the author owns projection and aspect |
| regions | base polygons |
| places | [{name, at, value, highlight?}] |
Sample data (golden)
{
"title": "The port yard holds half of all stored items",
"eyebrow": "STOCK BY LOCATION",
"source": "Source: sample dataset v1, 2026-07-12",
"unit": "items",
"regions": [
{
"name": "North",
"label_at": [
32,
17
],
"polygon": [
[
10,
5
],
[
55,
2
],
[
60,
25
],
[
35,
32
],
[
8,
28
]
]
},
{
"name": "West",
"label_at": [
19,
45
],
"polygon": [
[
8,
28
],
[
35,
32
],
[
30,
60
],
[
5,
58
]
]
},
{
"name": "Central",
"label_at": [
48,
42
],
"polygon": [
[
35,
32
],
[
60,
25
],
[
68,
50
],
[
30,
60
]
]
},
{
"name": "East",
"label_at": [
78,
38
],
"polygon": [
[
60,
25
],
[
92,
20
],
[
95,
55
],
[
68,
50
]
]
},
{
"name": "South",
"label_at": [
58,
72
],
"polygon": [
[
30,
60
],
[
68,
50
],
[
95,
55
],
[
90,
90
],
[
25,
88
]
]
}
],
"places": [
{
"name": "Port yard",
"at": [
80,
30
],
"value": 6400,
"highlight": true
},
{
"name": "Yard B",
"at": [
45,
40
],
"value": 1500
},
{
"name": "Yard C",
"at": [
25,
45
],
"value": 900
},
{
"name": "South store",
"at": [
55,
75
],
"value": 1800
},
{
"name": "North bins",
"at": [
30,
15
],
"value": 600
},
{
"name": "West dump",
"at": [
12,
50
],
"value": 300
}
]
}