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

DL-01 AGRAW
The port yard holds half of all stored items Port yard 6400 items Yard B 1500 Yard C 900 South store 1800 North bins 600 West dump 300 Source: sample dataset v1, 2026-07-12

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

titleaction title with a number
sourcebottom-left always
uniton first place
notecoordinates are author-supplied unit-square (0-100) geometry; the renderer scales, the author owns projection and aspect
regionsbase 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
    }
  ]
}