Sankey 桑基图
上一篇
Rose 玫瑰图
下一篇
Stock 股票图
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(可选) | - | 
source 和 target 字段,缺失则无法绘制。默认使用 value 进行值的映射,当数据中缺乏 value 字段时,需要使用 valueField 指定值的映射关系。[{ source: "Agricultural 'waste'", target: 'Bio-conversion', value: 124 },]
nodes 和 links,一般用于处理存在环的情况。{nodes: [{ id: 'a', key: '首页' },{ id: 'b', key: '页面1' },],links: [{ source: 'a', target: 'b', value: 100 },],}
桑基图作为复合图形,配置 tooltip 的时候需要区分节点和连接线。
不同于单一标记配置 title,桑基图需要分别配置 nodeTitle 和 linkTitle 。
({tooltip: {nodeTitle: (d) => d.key,linkTitle: (d) => 'link',},});
不同于单一标记配置 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: '连接线自定义属性',};},],},});
| 配置项 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| nodeId | 节点绑定字段,在布局中作为唯一标识,如果未指定 nodeId,默认为(node) => node.key | (node: any) => string | - | 
| nodeAlign | 当前节点的对齐方法。除了内置的几种类型外,还可以传递当前节点和图的总深度 n(最大的节点深度+1 ),并且必须返回0到n - 1之间的整数,指示节点在生成图中所需的水平位置。 | left、right、center、justify|((node: any, n: number) => number | - | 
| nodeWidth | 节点的宽度 | number | 0.02 | 
| nodePadding | 节点的间距 | number | 0.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-sankey | number | 6 | 
| linkColorField | 连线颜色映射字段 | (d) => d.source.key | - | 
| linkLabels | 连线标签配置 | object[] | - | 
样式通过 text、node、link 前缀区分,更多参绘图属性
| 配置项 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| labelText | 文本内容 | (d) => d.key | - | 
| labelFontSize | 文本字号 | number | - | 
| labelSpacing | 文本和节点间的距离 | number | - | 
| nodeStroke | 节点描边 | string | - | 
| linkLineWidth | 连接线描边宽度 | number | - | 
内置数据标签的配置如下。
({labels: [{text,dx: (d) => (d.x[0] < 0.5 ? spacing : -spacing),...labelStyle, // 用户传入的数据标签自定义样式},...nodeLabels, // 用户传入的自定义数据标签],});
除了节点内置的数据标签以外,你还可以自定义节点数据标签的配置。
({nodeLabels: [{text: (d) => d.key,fontSize: 10, // 注意!!!这里的绘图属性不再需要加label前缀fill: 'red',},],});
连接线没有内置的数据标签,你可以自定义连接线数据标签的配置。
({linkLabels: [{text: (d) => d.key,fontSize: 10, // 注意!!!这里的绘图属性不再需要加label前缀fill: 'yellow',},],});
详见选项-事件。
详见图表概览-图表方法。
和一般组件自定义 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>`;},},},};
对于多次出现的节点,设置 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,},};