文章 DAG 可视化布局库 - dagre-compound
Post
Cancel

DAG 可视化布局库 - dagre-compound

关于 dagre-compound

dagre-compound

如果你了解或使用过 dagre 或者 dagre-d3 等可视化布局库,或者有图可视化布局相关知识,会对理解和使用该布局库有很大的帮助。

  • 针对具有层级结构的 DAG 图布局
  • 支持跨层级节点相连,保持其层级关联关系
  • 优化跨层级节点相连导致的边交叉问题

demo

快速上手

stackblitz 在线演示:React DemoAngular Demo

API 文档请参考:API 文档

安装

1
$ npm i dagre-compound --save

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import { buildGraph, HierarchyGraphNodeInfo } from 'dagre-compound';

const data = {
    nodes: [
      { id: '0-1'},
      { id: '0-2'},
      { id: '1-1'},
      { id: '1-2'},
    ],
    edges: [
      { v: '0-1', w: '0-2' },
      { v: '0-2', w: '1-1' },
      { v: '1-1', w: '1-2' }
    ],
    compound: {
      GROUP0: ['0-1', '0-2']
    }
}
const renderInfo: HierarchyGraphNodeInfo = buildGraph(data);

更多问题

  • 获取绝对定位

默认 dagre-compound 生成具有层级结构的布局数据,边与节点的位置均为相对组节点的位置。 如果你希望使用绝对定位来渲染 svg 元素,可参考如下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// ROOT 节点  
ROOT_NAME = '◬ROOT◬';
/**
 * 计算节点的绝对位置,用于 g 元素定位
 * parent 节点为 ROOT 节点时无需执行此方法
 */
const calcAbsolutePos = (node: HierarchyGraphNodeInfo | HierarchyBaseNodeInfo, parent: HierarchyGraphNodeInfo): void => {
  node.x = parent.x - parent.coreBox.width / 2 + node.x;
  node.y = parent.y - (parent.coreBox.height / 2 - node.y) + parent.labelHeight;
}

/**
 * 计算边 point 的绝对位置
 */
const calcAbsoluteEdgePos = (edges: HierarchyBaseEdgeInfo[], node: HierarchyGraphNodeInfo) => {
  const offsetX = node.name === ROOT_NAME ? 0 : node.x - node.coreBox.width / 2;
  const offsetY = node.name === ROOT_NAME ? 0 : node.y - node.coreBox.height / 2 + node.paddingTop;
  edges.forEach(e => {
    // 同步 points 为绝对定位
    e.points = e.points.map(ne => {
      const x = ne.x + offsetX;
      const y = ne.y + offsetY;
      return {
        ...ne,
        x,
        y
      };
    });
  });
};
This post is licensed under CC BY 4.0 by the author.