Skip to content
InsightCharts

Search

Search guides and components

Sankey chart

Shows how a quantity flows from sources through stages to destinations, with link width proportional to the flow.

Use when
Where things come from and where they go: energy from fuel to end use, budget from revenue to spending, users from channel to outcome. Works best with 2 to 4 stages and up to about 20 nodes.
Avoid when
A single sequence of steps with drop-off (use funnel chart); comparing a few totals (use bar chart); flows that loop back (cycles cannot be drawn and are dropped); more than about 40 links.

Preview

220 TWh of the 860 TWh used to generate electricity was lost

Energy flows from fuel to end use, terawatt-hours per year

Source: Illustrative national energy balance

Composition

Used in

No molecule or template lists sankey chart in its composes. It still fits any slot that takes a component.

Installation

$ pnpm dlx shadcn@latest add @insightcharts/sankey-chart

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 { SankeyChart } from "insightcharts";

Examples

Two stages, highlight

52% of referred visitors signed up last quarter

Visitors by acquisition channel and outcome, last quarter

Illustrative data

Vertical

Borrowing funded £130bn of the £1,040bn budget

Government revenue by source and spending by area, £ billion

Illustrative data

Stress: four stages, many nodes, long names, a loop

Power stations lost 400 PJ of the 1,060 PJ they took in

National energy balance from primary supply to final use, petajoules

Illustrative data. One circular flow in the data is left out

Props

PropTypeDefaultDescription
fromstring"source"Field naming where each flow starts. Not called source because that is the figure's source line.
tostring"target"Field naming where each flow ends.
valuestring"value"Flow size field. Non-positive flows are dropped.
orientation"auto" | "horizontal" | "vertical""auto"Left to right, or top to bottom for narrow columns with short names.
labelsbooleantruePrint each node's total after its name.
namesRecord<string, string>Display names for node keys.
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>.