Skip to content

API Sankey

Các luồng giữa các nút được bố trí theo cột, với độ dày dải tỷ lệ với giá trị luồng (xây dựng trên d3-sankey) - xem bản demo Sankey.

Import

ts
import "@michi-vz/wc/sankey-chart";
// <michi-vz-sankey-chart> is now defined
ts
import { mountSankeyChart } from "@michi-vz/core";

const chart = mountSankeyChart(el, props);

Props

PropTypeDefaultDescription
timelineboolean | TimelinePeriodConfig-Opt-in "play through years": snapshots one period at a time over the period tags in the data, with a headless controller (`chart.timeline()`) plus the built-in play button + scrubber. Values tween between periods unless `interpolate: false`. Off by default; wins over `progressiveDraw` when both are set.
progressiveDrawboolean | ProgressiveDrawConfig-Opt-in reveal animation: wipes the marks in left to right on mount (a clip reveal; axes and titles stay put). `true` uses defaults (1200 ms, easeInOutCubic); a config tunes durationMs, easing, autoplay, and replayOnUpdate (`tipLabel` is LineChart-only and ignored here). Off by default; respects prefers-reduced-motion (renders fully drawn instantly) and `replay()` re-runs it.
nodes*SankeyNodeItem[]-Flow nodes; each needs a unique id that links reference
links*SankeyLinkItem[]-Directed flows between nodes (source -> target); band thickness is proportional to value
titlestring-Optional chart title rendered above the plot
nodeWidthnumber18Node rect width in px (default 18).
nodePaddingnumber12Vertical gap between nodes in a column in px (default 12).
nodeRadiusnumber2Corner radius of the node rects in px (default 2; 0 = square corners). Clamped to half the node's shorter side.
linkRadiusnumber2Corner radius (px) of the filled flow ribbons where they meet the nodes (default 2; 0 = sharp corners). Clamped to half the band's thickness.
linkColorMode"source" | "target""source"Colour links by their "source" (default) or "target" node.
linkOpacitynumber0.45Link opacity in [0,1] (default 0.45).
showLabelsbooleantrueDraw node labels (default true).
isLoadingboolean-Show the loading overlay and skip the no-data check (legacy michi-vz parity).
isNodataboolean | ((dataSet: SankeyNodeItem[] | null | undefined) => boolean)-No-data override: boolean, or a predicate on nodes; default = empty nodes.
noDataLabelstring-Text for the vanilla default no-data overlay (ignored when suppressed).
suppressDefaultOverlayboolean-A framework wrapper sets this to render its OWN loading/no-data node instead.
valueFormatter(n: number) => string-Formats a numeric value for labels and tooltips
tooltipFormatter(mark: SankeyNodeContext | SankeyLinkContext) => string-Returns custom tooltip HTML for a hovered datum/mark (sanitized before it is inserted)
onHighlightItem(labels: string[]) => void-Called when the hovered/highlighted label(s) change
Common props - shared by every chart (14)
PropTypeDefaultDescription
widthnumber800Chart width in pixels
heightnumber500Chart height in pixels
marginMargin{ top: 36, right: 12, bottom: 12, left: 12 }Inner margins (top/right/bottom/left, in px) reserved for axes, titles, and labels
colorsstring[]-Categorical palette for series/labels without an explicit colour or colorsMapping entry
colorsMappingRecord<string, string>-Explicit label -> colour map; takes precedence over the palette and per-item colours
highlightItemsstring[]-Labels to emphasise; all other marks dim
disabledItemsstring[]-Labels to hide and exclude from scales/stacks
renderer"svg" | "canvas" | "webgpu""svg"Render as inline SVG (default) or to a canvas (faster for large datasets); getContext() is identical either way
localestring-BCP-47 locale used for number and date formatting
skipColorMappingDispatchbooleanfalseExternal-CSS mode: unmapped labels resolve to transparent and onColorMappingGenerated is not emitted, so mark colours come from your CSS via the data-label-safe contract
enableTransitionsbooleantrueAnimate updates with CSS transitions (default true)
onColorMappingGenerated(mapping: Record<string, string>) => void-Called with the resolved label -> colour map after the chart assigns colours
onChartDataProcessed(context: ChartContext) => void-Called with the renderer-agnostic ChartContext whenever the data is (re)processed
onDataWarning(warnings: DataWarning[]) => void-Called with any non-fatal data warnings (duplicate labels, non-finite values, non-monotonic dates, ...)

Dữ liệu là hai mảng

Khác với các biểu đồ khác, Sankey nhận nodes ({ id, label?, color? }[]) và links ({ source, target, value }[]) thay vì một dataSet duy nhất.

Events

Web component phát ra các CustomEvent nổi bọt (bubbling) sau đây (engine cũng cung cấp tương đương qua các callback on* trong bảng ở trên):

EventDetailKích hoạt khi
michi-vz:highlightstring[]khi trạng thái tô sáng hover thay đổi (id của nút, hoặc source + target của một liên kết)
michi-vz:colormappingRecord<string, string>khi một color mapping được tạo ra
michi-vz:dataprocessedChartContextkhi dữ liệu được xử lý (lại)
michi-vz:datawarningDataWarning[]khi phát hiện cảnh báo về dữ liệu đầu vào (ví dụ một liên kết trỏ đến một nút không xác định)

getContext()

mountSankeyChart(el, props).getContext() trả về một SankeyChartContext không phụ thuộc bộ dựng: các nodes (id / label / color / value / độ sâu cột), các links (source / target / value / color), số liệu thống kê tóm tắt (số lượng nút & liên kết, số lượng cột, tổng luồng, liên kết lớn nhất, nút bận rộn nhất), một bản tóm tắt ngôn ngữ tự nhiên có tính xác định, và một bảng a11y liệt kê các luồng. Xem ngữ cảnh LLM.

Source

Các prop được định kiểu là SankeyChartProps trong @michi-vz/core.