Skip to content
InsightCharts

Search

Search guides and components

Choropleth map

Colours the regions of a map by a normalised value, from GeoJSON you supply.

Use when
A rate, share or per-capita figure that varies by place, where the geographic pattern (a north-south divide, a cluster) is what the reader needs to see. Use a diverging scale for change or for values either side of a meaningful midpoint.
Avoid when
Raw counts, which mostly map population (normalise first, or use bar chart); ranking regions precisely (use bar chart); a handful of regions with no spatial pattern (use bar chart); regions so different in size that small ones vanish (use a tile-grid GeoJSON).

Preview

47% of homes in South Australia had rooftop solar in 2023

Share of dwellings with a solar installation, by state and territory, 2023

Source: Australian PV Institute · Approximate figures on a simplified block map

Composition

Used in

1 infographic uses choropleth map.

Infographics

1

A landscape spread of up to eleven small illustrations of one subject, each a different graphic form, in three bands of unequal panels: a statement in large type, spokes round an icon and a network of circles; a smooth trend with its peak labelled, nested squares and a slope chart; a pill ranking, a treemap, a tile map and sized circles; and a closing row of icon statements.

Installation

$ pnpm dlx shadcn@latest add @insightcharts/choropleth-map

The CLI copies the source into your project and needs the @insightcharts registry in components.json; see installation. With the package, import it by name:

import { ChoroplethMap } from "insightcharts";

Examples

Diverging, with missing regions

Queensland gained 3.1 people per 1,000 residents from interstate migration

Net interstate migration per 1,000 residents, year to June

Source: Illustrative data

Tile grid with labels, loaded from a URL

Median full-time pay in London was £46,200 in 2023

Median full-time annual earnings by English region, £ thousand, 2023

Source: ONS Annual Survey of Hours and Earnings · Rounded. Each region is drawn as one equal tile

Props

PropTypeDefaultDescription
georequiredGeoJSON FeatureCollection | stringThe map: a GeoJSON object, or a URL to fetch one from. Registered with ECharts automatically.
regionrequiredstringRow field holding the region name that joins to the GeoJSON.
valuerequiredstringRow field holding the value. Use a rate or share, not a raw count.
namePropertystring"name"GeoJSON feature property holding each region's name.
scale"sequential" | "diverging""sequential"Sequential for magnitude; diverging for values either side of a midpoint.
midpointnumber0Centre of the diverging scale.
domain[number, number]Fix the colour scale instead of using the data's range.
labelsboolean | "value"falsePrint region names on the map; "value" adds the value on a second line.
labelPropertystringGeoJSON feature property to print instead of the full name, e.g. a postal or ISO code.
missingLabelstring"No data"Legend text for regions without a value.
aspectScalenumber0.75Horizontal stretch for longitude; 1 for tile maps and projected coordinates.
Common chart props 29

Every chart built with defineChart accepts these on top of its own props.

PropTypeDescription
dataDataInputRows, CSV text, a URL, { url, path }, an async function, or an Arrow-style table. Omit inside <InsightData>.
transformTransform | Transform[]A pipeline of transforms applied before drawing.
titlestringThe title. One plain statement of what the data shows, with the number and the period ("Monthly churn fell from 4.2% to 2.1% in 2024"), or a plain label ("Monthly churn, 2024"). One clause, no figures of speech.
subtitlestringMeasure, unit, population, period.
sourcestringData source, shown as "Source: ...".
notestringMethod notes or caveats.
heightnumber | stringCSS height of the plot. Default 360.
aspectnumberWidth / height. Overrides height.
highlightstring | string[]The entity (or entities) the title is about. Every other series is drawn in grey.
annotationsAnnotation[]Reference lines, shaded bands and callouts, in data coordinates.
formatFormatSpecHow to print values: "compact", "percent", "currency:USD", "{value} kg", Intl options, or a function.
legendbooleanShow the legend. Default: shown when there are two or more series.
selectboolean | stringMake marks clickable to filter. Inside <InsightData> the selection filters every other chart. Pass a field name, or true to use the chart's category field.
onSelect(values: string[], field: string) => voidCalled with the selected values whenever the selection changes.
optionEChartsOption | ((option: EChartsOption, ctx: BuildContext) => EChartsOption)Deep-merged over the generated ECharts option, or a function that receives and returns it. Use it for ECharts settings no prop covers.
themeThemeInputA theme, or a partial set of tokens merged over the surrounding theme, for this chart only.
modeModeInput"auto" (default) follows the page, "system" follows the OS, or force "light" / "dark".
rendererRendererInput"auto" (default) uses SVG for light charts and canvas for heavy ones.
animatebooleanSet false to disable animation. Reduced-motion preferences are always respected.
lazybooleanMount the chart only when it scrolls near the viewport. Default true.
groupstringLink tooltips with other charts sharing this group id.
exportableboolean | ExportFormat[]Show an export menu: true or a list of formats from png, jpeg, svg, pdf, csv, json.
tablebooleanShow a collapsible "View data" table under the chart.
altstringAccessible description: the chart type and measures, then the main pattern and the notable values.
idstringStable id for this chart's selection in the shared store.
onEventsRecord<string, ChartEventHandler>ECharts event handlers, e.g. { click: (params, chart) => {} }. Prefix a name with zr: to bind to the canvas itself.
onReady(chart: EChartsInstance) => voidCalled with the ECharts instance once it is created.
classNamestringClass name for the outer <figure>.
styleCSSPropertiesInline style for the outer <figure>.