logo

Ant Design Charts

  • 教程
  • 选项
  • 图表示例
  • 所有产品antv logo arrow
  • 2.0.0
  • 📈 图表分类
  • 统计图表
    • 图表组成
    • 图表组件 - Component
      • 标题(Title)
      • 坐标轴(Axis)
      • 图例(Legend)
      • 滚动条(Scrollbar)
      • 缩略轴(Slider)
      • 提示信息(Tooltip)
      • 数据标签(Label)
    • 核心概念 - Core
      • 视图(View)
      • 数据(Data)
        • 概览
        • custom
        • ema
        • fetch
        • filter
        • fold
        • inline
        • join
        • kde
        • log
        • map
        • pick
        • rename
        • slice
        • sort
        • sortBy
      • 比例尺(Scale)
        • 概览
        • band
        • linear
        • log
        • ordinal
        • point
        • pow
        • quantile
        • quantize
        • sqrt
        • threshold
        • time
      • 转换(Transform)
        • 概览
        • bin
        • binX
        • diffY
        • dodgeX
        • flexX
        • group
        • groupColor
        • groupX
        • groupY
        • jitter
        • jitterX
        • jitterY
        • normalizeY
        • pack
        • sample
        • select
        • selectX
        • selectY
        • sortColor
        • sortX
        • sortY
        • stackEnter
        • stackY
        • symmetryY
      • 坐标系(Coordinate)
        • 概览
        • fisheye
        • parallel
        • polar
        • radial
        • theta
        • transpose
        • cartesian3D
      • 样式(Style)
      • 动画(Animate)
        • 概览
        • fadeIn
        • fadeOut
        • growInX
        • growInY
        • morphing
        • pathIn
        • scaleInX
        • scaleInY
        • scaleOutX
        • scaleOutY
        • waveIn
        • zoomIn
        • zoomOut
      • 状态(State)
      • 交互(Interaction)
        • 概览
        • brushAxisHighlight
        • brushHighlight
        • brushXHighlight
        • brushYHighlight
        • brushFilter
        • brushXFilter
        • brushYFilter
        • chartIndex
        • elementHighlight
        • elementHighlightByColor
        • elementHighlightByX
        • elementSelect
        • elementSelectByColor
        • elementSelectByX
        • fisheye
        • legendFilter
        • legendHighlight
        • poptip
        • scrollbarFilter
        • sliderFilter
      • 复合(Composition)
        • 概览
        • facetCircle
        • facetRect
        • repeatMatrix
        • spaceFlex
        • spaceLayer
        • timingKeyframe
      • 主题(Theme)
        • 概览
        • academy
        • classic
        • classicDark
      • 事件(Event)
      • 颜色映射(Color)
    • 专有配置 - Specal Plot
      • Area 面积图
      • Bar 条形图
      • CirclePacking 捆绑图
      • DualAxes 双轴图
      • Gauge 仪表盘
      • Line 折线图
      • Rose 玫瑰图
      • Sankey 桑基图
      • Scatter 散点图
      • Sunburst 旭日图
      • Treemap 矩阵树图
      • Venn 韦恩图
      • WordCloud 词云图
      • Column 柱状图
      • Pie 饼图
      • BidirectionalBar 对称条形图
      • Box 箱线图
      • Bullet 子弹图
      • Funnel 漏斗图
      • Heatmap 热力图
      • Histogram 直方图
      • Liquid 水波图
      • Radar 雷达图
      • Stock 股票图
      • Tiny 迷你图
      • Violin 小提琴图
      • Waterfall 瀑布图
      • RadialBar 玉珏图
  • 关系图组件
    • 总览
    • MindMap 思维导图
    • Fishbone 鱼骨图
    • IndentedTree 缩进树图
    • Dendrogram 生态树图
    • OrganizationChart 组织结构图
    • FlowGraph 流程图
    • FlowDirectionGraph 流向图
    • NetworkGraph 网络图
    • FAQ

Sankey 桑基图

上一篇
Rose 玫瑰图
下一篇
Scatter 散点图

Resources

Ant Design
Galacea Effects
Umi-React 应用开发框架
Dumi-组件/文档研发工具
ahooks-React Hooks 库

社区

体验科技专栏
seeconfSEE Conf-蚂蚁体验科技大会

帮助

GitHub
StackOverflow

more products更多产品

Ant DesignAnt Design-企业级 UI 设计语言
yuque语雀-知识创作与分享工具
EggEgg-企业级 Node 开发框架
kitchenKitchen-Sketch 工具集
GalaceanGalacean-互动图形解决方案
xtech蚂蚁体验科技
© Copyright 2025 Ant Group Co., Ltd..备案号:京ICP备15032932号-38

Loading...

桑基图 (Sankey Diagram),是一种特定类型的流图,用于描述一组值到另一组值的流向。桑基图的特点如下: 起始流量和结束流量相同,所有主支宽度的总和与所有分出去的分支宽度总和相等,保持能量的平衡; 在内部,不同的线条代表了不同的流量分流情况,它的宽度成比例地显示此分支占有的流量; 节点不同的宽度代表了特定状态下的流量大小。 桑基图通常应用于能源、材料成分、金融等数据的可视化分析。

开始使用

sankey

{
data: {
type: 'fetch',
value: 'https://assets.antv.antgroup.com/g2/energy.json',
transform: [
{
type: 'custom',
callback: (data) => ({ links: data }),
},
],
},
style: {
labelSpacing: 3,
labelFontWeight: 'blod',
nodeStrokeWidth: 1.2,
linkFillOpacity: 0.4
}
}

Ant Design Charts 中布局(Layout) 用于指定一些有特定布局函数标记的布局方法的参数,比如 Snakey, WordCloud 等。

({
layout: {
nodeAlign: 'center',
nodePadding: 0.03,
},
});

选项

属性描述类型默认值
tooltip配置桑基图的 tooltip,详见 tooltip 配置object详见 tooltip 配置
layout配置桑基图的布局方式,详见 layout 配置object详见 layout 配置
style配置图形样式和标签样式,详见 style 配置object详见 style 配置
nodeLabels自定义节点数据标签的配置,详见 nodeLabels 配置label[][]
linkLabels自定义连接线数据标签的配置,详见 linkLabels 配置label[][]

tooltip

桑基图作为复合图形,配置 tooltip 的时候需要区分节点和连接线。

title

不同于单一标记配置 title,桑基图需要分别配置 nodeTitle 和 linkTitle 。

({
tooltip: {
nodeTitle: (d) => d.key,
linkTitle: (d) => 'link',
},
});

items

不同于单一标记配置 items,桑基图需要同时配置 nodeItems 和 linkItems 。

和一般的 items 一样, nodeItems 和 linkItems 也支持自定义配置:

({
tooltip: {
nodeItems: [
(d, index, data, column) => {
return {
color: 'red', // 指定 item 的颜色
name: '节点', // 指定 item 的名字
value: d.key, // 使用 y 通道的值
content: '节点自定义属性',
};
},
],
linkItems: [
(d, index, data, column) => {
return {
color: 'red', // 指定 item 的颜色
name: '连接线', // 指定 item 的名字
value: `${d.source.key}-${d.target.key}`, // 使用 y 通道的值
content: '连接线自定义属性',
};
},
],
},
});

💡 桑基图怎么使用 data 中的补充属性实现自定义 tooltip 的展示?

和一般 Mark 自定义 tooltip 交互的方法类似,先在图形的 tooltip 里传入自定义属性,然后在 interaction 里使用。

示例:

const data = {
nodes: [
{ id: 'a', key: '首页', des: '节点自定义属性' },
{ id: 'b', key: '页面1', des: '节点自定义属性' },
{ id: 'b_1', key: '页面1', des: '节点自定义属性' },
{ id: 'c', key: '页面2', des: '节点自定义属性' },
{ id: 'c_1', key: '页面2', des: '节点自定义属性' },
{ id: 'd', key: '页面3', des: '节点自定义属性' },
{ id: 'd_1', key: '页面3', des: '节点自定义属性' },
],
links: [
{ source: 'a', target: 'b', value: 100 },
{ source: 'b', target: 'c', value: 80 },
{ source: 'b', target: 'd', value: 20 },
{ source: 'c', target: 'b_1', value: 80 },
{ source: 'b_1', target: 'c_1', value: 40 },
{ source: 'b_1', target: 'd_1', value: 40 },
],
};
const config = {
width: 900,
height: 600,
data: {
value: data,
transform: [
{
type: 'custom',
callback: (data) => ({
nodes: data.nodes,
links: data.links,
}),
},
],
},
tooltip: {
nodeItems: [
(d, index, data, column) => {
return {
content: d.des,
};
},
],
linkItems: [
(d, index, data, column) => {
return {
color: 'red', // 指定 item 的颜色
name: '连接线', // 指定 item 的名字
value: `${d.source.key}-${d.target.key}`, // 使用 y 通道的值
content: '连接线自定义属性',
};
},
],
},
layout: {
nodeId: (d) => d.id,
nodeAlign: 'center',
nodePadding: 0.03,
iterations: 25,
},
style: {
labelSpacing: 3,
labelFontWeight: 'bold',
// linkFillOpacity: 0.2,
// linkFill: '#3F96FF',
},
interaction: {
tooltip: {
render: (e, { items, title }) => {
return `<div>${items[0].content}</div>`;
},
},
},
};

layout

桑基图的布局方式。具体配置项如下:

nodeId

optional function

回调的方式为:(node: any) => string,如果未指定 nodeId,默认为 (node) => node.key。

节点绑定字段,在布局中作为唯一标识。

💡 桑基图不支持成环,那在页面流向图这种会出现重复节点的情况应该怎么配置?

对于多次出现的节点,设置 id 作为唯一标识,并配置 nodeId 的回调方法为 (node) => node.id。

示例:

const data = {
nodes: [
{ id: 'a', key: '首页' },
{ id: 'b', key: '页面1' },
{ id: 'b_1', key: '页面1' },
{ id: 'c', key: '页面2' },
{ id: 'c_1', key: '页面2' },
{ id: 'd', key: '页面3' },
{ id: 'd_1', key: '页面3' },
],
links: [
{ source: 'a', target: 'b', value: 100 },
{ source: 'b', target: 'c', value: 80 },
{ source: 'b', target: 'd', value: 20 },
{ source: 'c', target: 'b_1', value: 80 },
{ source: 'b_1', target: 'c_1', value: 40 },
{ source: 'b_1', target: 'd_1', value: 40 },
],
};
const config = {
width: 900,
height: 600,
data: {
value: data,
transform: [
{
type: 'custom',
callback: (data) => ({
nodes: data.nodes,
links: data.links,
}),
},
],
},
layout: {
nodeId: (d) => d.id,
nodeAlign: 'center',
nodePadding: 0.03,
iterations: 25,
},
style: {
labelSpacing: 3,
labelFontWeight: 'bold',
linkFillOpacity: 0.2,
linkFill: '#3F96FF',
},
};

nodeSort

optional function

回调的方式为:((a: any, b: any) => number)

节点排序方式。如果未指定 nodeSort ,则返回当前节点排序方法,默认为 undefined,表示每列内的节点垂直顺序将由布局自动确定。如果 nodeSort 为 null,则顺序由输入固定。否则,由指定的排序函数确定顺序;该函数传递两个节点,如果第一个节点应位于第二个节点上方,则必须返回小于 0 的值,如果第二个节点应位于第一个节点上方,则必须返回大于 0 的值,如果未指定顺序,则返回 0。

linkSort

optional function

回调的方式为:((a: any, b: any) => number)

连接线排序方式。如果未指定 linkSort ,则返回当前连接线排序方法,默认为 undefined,表示每个节点内的连接线的垂直顺序将由布局自动确定。如果 linkSort 为 null,则顺序由输入固定。否则,由指定的排序函数确定顺序;该函数传递两个连接线,如果第一个连接线应位于第二个连接线上方,则必须返回小于 0 的值,如果第二个连接线应位于第一个连接线上方,则必须返回大于 0 的值,如果未指定顺序,则返回 0。

nodeAlign

optional string | function

内置支持的类型有: 'left' | 'right' | 'center' | 'justify'

回调的方式为:((node: any, n: number) => number

当前节点的对齐方法。除了内置的几种类型外,还可以传递当前节点和图的总深度 n (最大的节点深度+1 ),并且必须返回 0 到 n - 1 之间的整数,指示节点在生成图中所需的水平位置。

nodeWidth

optional number

节点的宽度。默认为 0.02。

nodePadding

optional number

节点的间距。默认为 0.02。

nodeDepth

optional function

回调的方式为:(datum: any, maxDepth: number) => number

节点的深度。

iterations

optional number

布局计算迭代次数,默认为 6, 次数越多,布局越合理。

更多 layout 配置,详见 d3-sankey

style

默认 style 配置:

({
// label
labelText: (d) => d.key,
labelSpacing: 5,
labelFontSize: 10,
// node
nodeStroke: '#000',
// link
linkFillOpacity: 0.5,
linkStroke: undefined,
});

复合图形标记需要通过不同的前缀来区分图形的配置。

  • <label>: 配置数据标签的前缀。
属性名类型介绍
labelText(d: any) => string桑基图配置默认的数据标签的值,默认为 (d) => d.key
labelSpacingnumber桑基图配置数据标签的间距,默认为 5
labelFontSizenumber桑基图数据标签文字大小
labelFontFamilystring桑基图数据标签文字字体
labelFontWeightnumber桑基图数据标签字体粗细
labelLineHeightnumber桑基图数据标签文字的行高
labelTextAlignstring设置桑基图数据标签文本内容的当前对齐方式, 支持的属性:center | end | left | right | start,默认值为start
labelTextBaselinestring设置桑基图数据标签在绘制文本时使用的当前文本基线, 支持的属性:top | middle | bottom | alphabetic | hanging。默认值为bottom
labelFillstring桑基图数据标签文字的填充色
labelFillOpacitynumber桑基图数据标签文字的填充透明度
labelStrokestring桑基图数据标签文字的描边
labelLineWidthnumber桑基图数据标签文字描边的宽度
labelLineDash[number,number]桑基图数据标签描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。
labelStrokeOpacitynumber桑基图数据标签描边透明度
labelOpacitynumber桑基图数据标签文字的整体透明度
labelShadowColorstring桑基图数据标签文字阴影颜色
labelShadowBlurnumber桑基图数据标签文字阴影的高斯模糊系数
labelShadowOffsetXnumber设置桑基图数据标签阴影距文字的水平距离
labelShadowOffsetYnumber设置桑基图数据标签阴影距文字的垂直距离
labelCursorstring桑基图数据标签鼠标样式。同 css 的鼠标样式,默认 'default'。
  • <node>: 配置节点的前缀。
属性名类型介绍
nodeFillstring桑基图节点填充色
nodeFillOpacitynumber桑基图节点填充透明度
nodeStrokestring桑基图节点的描边
nodeStrokeOpacitynumber桑基图节点描边透明度
nodeLineWidthnumber桑基图节点描边的宽度
nodeLineDash[number,number]桑基图节点描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。
nodeOpacitynumber桑基图节点的整体透明度
nodeShadowColorstring桑基图节点阴影颜色
nodeShadowBlurnumber桑基图节点阴影的高斯模糊系数
nodeShadowOffsetXnumber设置阴影距桑基图节点的水平距离
nodeShadowOffsetYnumber设置阴影距桑基图节点的垂直距离
nodeCursorstring桑基图节点鼠标样式。同 css 的鼠标样式,默认 'default'。
  • <link>: 配置连接线的前缀。
属性名类型介绍
linkFillstring桑基图连接线填充色
linkFillOpacitynumber桑基图连接线填充透明度
linkStrokestring桑基图连接线的描边
linkStrokeOpacitynumber桑基图连接线描边透明度
linkLineWidthnumber桑基图连接线描边的宽度
linkLineDash[number,number]桑基图连接线描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。
linkOpacitynumber桑基图连接线的整体透明度
linkShadowColorstring桑基图连接线阴影颜色
linkShadowBlurnumber桑基图连接线阴影的高斯模糊系数
linkShadowOffsetXnumber设置阴影距桑基图连接线的水平距离
linkShadowOffsetYnumber设置阴影距桑基图连接线的垂直距离
linkCursorstring桑基图连接线鼠标样式。同 css 的鼠标样式,默认 'default'。

nodeLabels

optional Label[]

内置数据标签的配置如下。

({
labels: [
{
text,
dx: (d) => (d.x[0] < 0.5 ? spacing : -spacing),
...labelStyle, // 用户传入的数据标签自定义样式
},
...nodeLabels, // 用户传入的自定义数据标签
],
});

除了节点内置的数据标签以外,你还可以自定义节点数据标签的配置。

({
nodeLabels: [
{
text: (d) => d.key,
fontSize: 10, // 注意!!!这里的绘图属性不再需要加label前缀
fill: 'red',
},
],
});

linkLabels

optional Label[]

连接线没有内置的数据标签,你可以自定义连接线数据标签的配置。

({
linkLabels: [
{
text: (d) => d.key,
fontSize: 10, // 注意!!!这里的绘图属性不再需要加label前缀
fill: 'yellow',
},
],
});