logo

Ant Design Charts

  • 教程
  • 图表组件
  • 图表示例
  • 选项
  • 所有产品antv logo arrow
  • 2.6.0
  • 📈 图表分类
  • 统计图表
    • 图表概览
    • Line 折线图
    • Column 柱状图
    • Bar 条形图
    • Area 面积图
    • Pie 饼图
    • DualAxes 双轴图
    • Scatter 散点图
    • WordCloud 词云图
    • Funnel 漏斗图
    • Heatmap 热力图
    • Histogram 直方图
    • Liquid 水波图
    • BidirectionalBar 对称条形图
    • Box 箱线图
    • Bullet 子弹图
    • CirclePacking 捆绑图
    • Gauge 仪表盘
    • Radar 雷达图
    • Rose 玫瑰图
    • Sankey 桑基图
    • Stock 股票图
    • Sunburst 旭日图
    • Treemap 矩阵树图
    • Venn 韦恩图
    • Tiny 迷你图
    • Violin 小提琴图
    • Waterfall 瀑布图
    • RadialBar 玉珏图
  • 关系图组件
    • 总览
    • MindMap 思维导图
    • Fishbone 鱼骨图
    • IndentedTree 缩进树图
    • Dendrogram 生态树图
    • OrganizationChart 组织结构图
    • FlowGraph 流程图
    • FlowDirectionGraph 流向图
    • NetworkGraph 网络图
    • FAQ

Sankey 桑基图

上一篇
Rose 玫瑰图
下一篇
Stock 股票图

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),是一种特定类型的流图,用于描述一组值到另一组值的流向,通常应用于能源、材料成分、金融等数据的可视化分析。桑基图的特点如下:

  • 起始流量和结束流量相同,所有主支宽度的总和与所有分出去的分支宽度总和相等,保持能量的平衡;
  • 在内部,不同的线条代表了不同的流量分流情况,它的宽度成比例地显示此分支占有的流量;
  • 节点不同的宽度代表了特定状态下的流量大小;

代码演示

更多示例详见桑基图

基础用法

节点排序

自定义节点颜色

自定边颜色

配置项

通用属性参考:通用配置

概览

配置项说明类型默认值
data数据Array[]
valueField值映射字段string(可选)-
tooltip配置桑基图的 tooltip,详见 tooltip 配置object详见 tooltip 配置
layout配置桑基图的布局方式,详见 layout 配置object详见 layout 配置
style配置图形样式和标签样式,详见 style 配置object详见 style 配置
nodeLabels自定义节点数据标签的配置,详见 nodeLabels 配置label[][]
linkLabels自定义连接线数据标签的配置,详见 linkLabels 配置label[][]
title用于指定图表的标题内容,详见标题object(可选)-
label数据标签是给图表添加标注的手段之一,详见标签object(可选)-
tooltip用于动态展示数据点的详细信息,详见提示object(可选)-
style视觉样式,配置项详见绘图属性object(可选)-
theme用于控制图表的整体外观,包括颜色、字体、边距等视觉属性,详见主题string | object(可选)light
onReady图表加载回调,用于后续的事件事件绑定Function(可选)-
scale将抽象数据映射为视觉数据,详见比例尺object(可选)-
animate动画作为可视化的重要组成部分,能显著提高数据可视化的表现力,详见动画object(可选)-
interaction提供了按需探索数据的能力,详见交互object(可选)-
state实现交互反馈、高亮、选中等效果,详见状态,不同交互下图表样式object(可选)-
annotations视图好比一个画板,Sankey 组件默认在其上绘制了一个桑基图,我们可以通过 annotations 在上面叠加更多的图层,详见标注Array(可选)-

data

  1. 数据中需要包含 source 和 target 字段,缺失则无法绘制。默认使用 value 进行值的映射,当数据中缺乏 value 字段时,需要使用 valueField 指定值的映射关系。
[
{ source: "Agricultural 'waste'", target: 'Bio-conversion', value: 124 },
]
  1. 数据中包含 nodes 和 links,一般用于处理存在环的情况。
{
nodes: [
{ id: 'a', key: '首页' },
{ id: 'b', key: '页面1' },
],
links: [
{ source: 'a', target: 'b', value: 100 },
],
}

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: '连接线自定义属性',
};
},
],
},
});

layout

配置项说明类型默认值
nodeId节点绑定字段,在布局中作为唯一标识,如果未指定 nodeId,默认为 (node) => node.key(node: any) => string-
nodeAlign当前节点的对齐方法。除了内置的几种类型外,还可以传递当前节点和图的总深度 n (最大的节点深度+1 ),并且必须返回 0 到 n - 1 之间的整数,指示节点在生成图中所需的水平位置。left、right、center、justify | ((node: any, n: number) => number-
nodeWidth节点的宽度number0.02
nodePadding节点的间距number0.02
nodeLabels节点标签配置object[]-
nodeDepth节点的深度(datum: any, maxDepth: number) => number-
nodeSort节点排序方式。如果未指定 nodeSort ,则返回当前节点排序方法,默认为 undefined,表示每列内的节点垂直顺序将由布局自动确定。如果 nodeSort 为 null,则顺序由输入固定。否则,由指定的排序函数确定顺序;该函数传递两个节点,如果第一个节点应位于第二个节点上方,则必须返回小于 0 的值,如果第二个节点应位于第一个节点上方,则必须返回大于 0 的值,如果未指定顺序,则返回 0。((a: any, b: any) => number)-
linkSort连接线排序方式。如果未指定 linkSort ,则返回当前连接线排序方法,默认为 undefined,表示每个节点内的连接线的垂直顺序将由布局自动确定。如果 linkSort 为 null,则顺序由输入固定。否则,由指定的排序函数确定顺序;该函数传递两个连接线,如果第一个连接线应位于第二个连接线上方,则必须返回小于 0 的值,如果第二个连接线应位于第一个连接线上方,则必须返回大于 0 的值,如果未指定顺序,则返回 0。((a: any, b: any) => number)-
iterations布局计算迭代次数,默认为 6, 次数越多,布局越合理。更多 layout 配置,详见 d3-sankeynumber6
linkColorField连线颜色映射字段(d) => d.source.key-
linkLabels连线标签配置object[]-

style

样式通过 text、node、link 前缀区分,更多参绘图属性

配置项说明类型默认值
labelText文本内容(d) => d.key-
labelFontSize文本字号number-
labelSpacing文本和节点间的距离number-
nodeStroke节点描边string-
linkLineWidth连接线描边宽度number-

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',
},
],
});

事件

详见选项-事件。

方法

详见图表概览-图表方法。

常见问题

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

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

示例:

{
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: '连接线自定义属性',
};
},
],
},
interaction: {
tooltip: {
render: (e, { items, title }) => {
return `<div>${items[0].content}</div>`;
},
},
},
};
  1. 桑基图不支持成环,那在页面流向图这种会出现重复节点的情况应该怎么配置?

对于多次出现的节点,设置 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 = {
layout: {
nodeId: (d) => d.id,
nodeAlign: 'center',
nodePadding: 0.03,
iterations: 25,
},
};