使用指南布局

布局总览

根据图的用途选择布局,比较同一份数据的排列效果

什么是布局

布局决定节点怎么排。比如,流程图可以按步骤从左到右排,关系网可以让联系紧密的节点靠近。如果数据里已经有节点坐标,省略 layout 就会沿用 x 和 y。

选择布局

类型描述配置示例
grid排成整齐的行列。{ type: 'grid', cols: 3 }
circular沿圆周排列。{ type: 'circular', radius: 100 }
dagre按流程或依赖关系分层。{ type: 'dagre', rankdir: 'LR', ranksep: 80 }
force让相连节点靠近,同时拉开节点间距。{ type: 'force', linkDistance: 100 }
d3-force用 D3 力模拟排列关系网络。{ type: 'd3-force', linkDistance: 100 }
force-atlas2用力模拟呈现网络中的群组。{ type: 'force-atlas2', kr: 8, kg: 2 }
fruchterman用引力和斥力分布节点。{ type: 'fruchterman', gravity: 12 }
radial可选。 围绕指定节点,按图上的距离分圈。{ type: 'radial', focusNode: '0', unitRadius: 68 }
concentric按节点度数排成同心圆。{ type: 'concentric', sortBy: 'degree' }
mds可选。 用平面上的距离表现节点在图中的远近。{ type: 'mds', linkDistance: 80 }
indented可选。 把树排成逐层缩进的目录。{ type: 'indented', indent: 80, rowHeight: 40 }
mindmap可选。 把树排成脑图分支。{ type: 'mindmap', levelGap: 120, nodeGap: 30 }
fishbone可选。 沿鱼骨主干展示分类和条目。{ type: 'fishbone', categoryGap: 180 }
random可选。 在指定范围内随机放置节点。{ type: 'random', width: 800, height: 600, center: [400, 300] }

表中的配置对象写在 layout 中。更多参数和效果见布局通用配置项。

可选布局

缩进树、思维导图、鱼骨图、放射布局、MDS 和随机布局需要先注册。npm 项目可以从各自的子路径导入,之后照常通过 layout.type 指定。

import { register } from '@antv/g6-lite';
import radial from '@antv/g6-lite/layouts/radial';

register('layout', 'radial', radial);

const layout = { type: 'radial', focusNode: '0', unitRadius: 68 };

通过 CDN 使用 UMD 时,在主脚本之后加载同版本的 dist/g6-lite-layouts.min.js,再从 G6LiteLayouts 取出要注册的布局。

<script src="https://cdn.jsdelivr.net/npm/@antv/g6-lite@0.1.0/dist/g6-lite.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@antv/g6-lite@0.1.0/dist/g6-lite-layouts.min.js"></script>
<script>
  G6Lite.register('layout', 'radial', G6LiteLayouts.radial);
</script>

注册的布局在主线程运行。

配置与示例

布局类型通过 layout.type 指定。下面用 Dagre 把三个步骤从左到右排列。

import { Graph } from '@antv/g6-lite';

const graph = new Graph({
  container: '#container',
  data: {
    nodes: [{ id: '提交' }, { id: '审核' }, { id: '发布' }],
    edges: [
      { source: '提交', target: '审核' },
      { source: '审核', target: '发布' },
    ],
  },
  layout: { type: 'dagre', rankdir: 'LR', ranksep: 80 },
  node: { style: { label: (node) => node.id } },
});

await graph.render();

切换下图的 Layout,可以比较同一份数据在网格、环形和 Dagre 布局中的效果。力导向布局见关系网络布局。

正在加载示例…
切换 Layout,对比同一张图的网格、环形和层级布局。
const layouts: Record<string, LayoutConfig> = {
  grid: { type: 'grid', rows: 2, cols: 3, width: 360, height: 160 },
  circular: { type: 'circular', radius: 100 },
  dagre: { type: 'dagre', rankdir: 'LR', nodesep: 64, ranksep: 96, nodeSize: 28 },
};

参数和运行时更新方式见布局通用配置项。需要自己计算坐标时,见自定义布局。