菜单

桑基图和流程图

相关源文件

本文档介绍了 Apache ECharts 中的桑基图和流程图功能。桑基图是一种特殊的流程图,用于可视化资源、能源、材料或成本在节点之间的流动。ECharts 提供了一个专门的系列类型来创建这些可视化,具有可自定义的节点、链接和交互行为。

概述

ECharts 中的桑基图通过 'sankey' 系列类型实现。它们显示节点之间的定向流动,其中每个链接的宽度与它代表的流量成正比。这些图特别适用于可视化能源、材料或成本在不同系统或流程之间的转移。

来源:src/chart/sankey/SankeyView.ts20-34 test/sankey.html57-74

核心组件

ECharts 中的桑基图实现由几个关键组件组成,它们协同工作以创建可视化。

来源:src/chart/sankey/SankeyView.ts35-102 src/chart/sankey/SankeyView.ts103-350

SankeyView

SankeyView 类是桑基图的主要渲染器。它继承自基类 ChartView,并负责处理

  • 处理来自系列模型的节点和链接数据
  • 为节点(矩形)和链接(路径)创建图形元素
  • 应用视觉样式并处理状态更改
  • 设置交互,如节点拖动和邻近焦点

来源:src/chart/sankey/SankeyView.ts103-350

SankeyPath

SankeyPath 类是桑基图中链接的自定义路径渲染器。它继承自基础的 graphic.Path 类,用于创建连接节点的贝塞尔曲线。主要特点包括:

  • 用于弯曲流动路径的自定义形状定义
  • 支持水平和垂直方向
  • 处理高亮和弱化状态的方法
  • 内置支持根据流量值调整链接宽度

来源:src/chart/sankey/SankeyView.ts56-101

数据结构

桑基图需要两个主要的数据数组:nodeslinks

节点

节点代表资源流动的实体。基本节点格式是:

{
    name: string,   // Node name for display and identification
    depth?: number, // Optional depth for manual layout positioning
    itemStyle?: {   // Visual styling for the node
        // Style properties
    },
    label?: {       // Label configuration
        // Label properties
    }
}

链接代表节点之间的流动。基本链接格式是:

{
    source: string, // Name of source node
    target: string, // Name of target node
    value: number   // Flow value, determines the width of the link
}

示例数据配置

来源:test/sankey.html57-74 test/sankey-depth.html47-104 test/sankey-labelValue.html45-61

布局配置

ECharts 中的桑基图支持水平和垂直方向,可以通过 orient 选项进行配置。

水平布局(默认)

在水平布局中,节点从左到右排列,链接在它们之间水平流动。

垂直布局

在垂直布局中,节点从上到下排列,链接在它们之间垂直流动。

可以使用以下选项控制布局行为:

选项描述
orient指定方向:'horizontal'(默认)或 'vertical'
nodeWidth节点矩形的宽度
nodeGap相同深度的节点之间的间隙
layout通过 depth 指定使用预定义节点位置或手动设置坐标,来指定 'none'

来源:src/chart/sankey/SankeyView.ts165-183 test/sankey.html107-126

视觉定制

桑基图为节点和链接提供了多种视觉定制选项。

节点样式

节点渲染为矩形,可以使用各种视觉属性进行样式设置。

来源:src/chart/sankey/SankeyView.ts262-293

链接渲染为宽度与流量值成比例的贝塞尔曲线。

链接的 color 属性可以具有特殊值:

  • 'source':使用源节点的颜色
  • 'target':使用目标节点的颜色
  • 'gradient':创建从源到目标颜色的渐变

来源:src/chart/sankey/SankeyView.ts358-383 test/sankey.html68-71

层级配置

levels 选项允许为不同深度的节点应用不同的样式。

来源:test/sankey-level.html63-106

交互功能

ECharts 桑基图支持多种交互功能以增强用户体验。

邻近焦点

当启用 focusNodeAdjacency 时,悬停在节点或链接上会高亮显示相邻的节点和链接。

来源:test/sankey.html65 test/sankey-depth.html125

焦点配置

emphasis 选项控制节点和链接被高亮显示时的视觉外观。

focus 属性可以设置为:

  • 'self':只高亮悬停的元素
  • 'adjacency':高亮相邻的节点和链接
  • 'trajectory':高亮整个流动路径

来源:test/sankey.html159-161 src/chart/sankey/SankeyView.ts245-252

节点拖动

可以通过设置 draggable 属性使节点可拖动。

拖动节点时,会分派一个带有新位置的 'dragNode' 操作,可以在后续渲染中使用它来更新节点的位置。

来源:src/chart/sankey/SankeyView.ts315-337

标签配置

桑基图支持节点和链接的可自定义标签。

节点标签

节点标签默认显示节点名称,并可通过各种选项进行配置。

来源:src/chart/sankey/SankeyView.ts276-289

边标签

边标签可以显示流量值并进行自定义。

来源: src/chart/sankey/SankeyView.ts203-228 test/sankey-labelValue.html72-89

完整配置示例

这里展示了桑基图的完整配置结构

来源: test/sankey.html57-74 test/sankey-level.html52-107 test/sankey-labelValue.html63-92

渲染过程

桑基图的渲染过程包括创建节点和链接的几个步骤

来源: src/chart/sankey/SankeyView.ts114-346

本文档主要关注桑基图,但 ECharts 还支持其他流程可视化类型,这些类型也可能适用于类似场景

  • 对于分层结构,请参阅 树状图
  • 对于网络关系,请参阅 图和树图
  • 对于基于时间的专题流程,请参阅 ThemeRiver 图(在 test/themeRiver.html 中引用)

来源: test/themeRiver.html

使用技巧

性能考量

对于具有大量节点和链接的大型桑基图

  • 考虑使用 `layout: 'none'` 选项并预定义节点位置
  • 禁用动画以提高性能:`animation: false`
  • 设置适当的 `nodeWidth` 和 `nodeGap` 值以避免重叠

最佳实践

  • 使用清晰、描述性的节点名称
  • 通过 `levels` 配置应用一致的颜色方案
  • 设置 `focusNodeAdjacency: true` 以启用交互式探索
  • 对于双向流量,为每个方向创建单独的链接
  • 考虑使用 `label.position` 选项以避免标签重叠

来源: test/sankey.html test/sankey-depth.html test/sankey-level.html