WIP: G6 迁移新官网

This commit is contained in:
zhanning.bzn 2019-11-16 17:22:09 +08:00
parent 3a6d561aba
commit 2d76e10184
9 changed files with 988 additions and 20 deletions

View File

@ -76,8 +76,8 @@ G6.registerNode(
| 名称 | 类型 | 是否必选 | 描述 |
| -------------- | ------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| edgeName | string | true | 自定义边的名称 |
| options | object | true | 自定义边时的配置项,配置项中包括完整的生命周期方法,具体请参考:[Shape 文档](https://www.yuque.com/antv/g6/shape-api)。 |
| extendEdgeName | string | false | 自定义边时可基于内置边进行定义,该字段表示内置边的名称,所有内置边请参考:[内置边](https://www.yuque.com/antv/g6/default-node#QtRZ2)。 |
| options | object | true | 自定义边时的配置项,配置项中包括完整的生命周期方法,具体请参考:[Shape 文档](/zh/docs/api/Shape)。 |
| extendEdgeName | string | false | 自定义边时可基于内置边进行定义,该字段表示内置边的名称,所有内置边请参考:[内置边](/zh/docs/manual/middle/elements/defaultEdge)。 |
**用法**
@ -134,7 +134,7 @@ G6.registerEdge(
| 名称 | 类型 | 是否必选 | 描述 |
| ------------ | ------ | -------- | ----------------------------------------------------------------------------------------------------------------------------- |
| behaviorName | string | true | 自定义 Behavior 的名称 |
| behavior | object | true | 自定义 behavior 时的配置项,配置项中包括的方法及作用具体请参考:[Behavior 文档](https://www.yuque.com/antv/g6/behavior-api)。 |
| behavior | object | true | 自定义 behavior 时的配置项,配置项中包括的方法及作用具体请参考:[Behavior 文档](/zh/docs/api/Behavior)。 |
**用法**
@ -189,7 +189,7 @@ G6.registerBehavior('behaviorName', {
| 名称 | 类型 | 是否必选 | 描述 |
| ---------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------- |
| layoutName | string | true | 自定义布局名称 |
| layout | object | true | 自定义布局的配置项,配置项中包括的方法及作用具体请参考:[Layout 文档](https://www.yuque.com/antv/g6/agbmu2)。 |
| layout | object | true | 自定义布局的配置项,配置项中包括的方法及作用具体请参考:[Layout 文档](/zh/docs/manual/middle/layout)。 |
**用法**

View File

@ -10,6 +10,7 @@ Graph 的生命周期为:初始化—>加载数据—>渲染—>更新—>销
## 初始化
### G6.Graph
**参数**
| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| container | String|HTMLElement | 图的 DOM 容器,可以传入该 DOM 的 id 或者直接传入容器的 HTML 节点对象 |
@ -35,13 +36,14 @@ Graph 的生命周期为:初始化—>加载数据—>渲染—>更新—>销
| maxZoom | Number | 10 | 最大缩放比例 |
| pixelRatio | Number | 1.0 | 像素比率 |
| groupType | String | circle | 节点分组类型,支持 circle 和 rect |
| groupStyle | Object | | groupStyle 用于指定分组的样式,详情参看[文档](https://www.yuque.com/antv/g6/taixri#f283J) |
| layout | Object | | 布局配置项,使用 type 字段指定使用的布局方式type可取以下值random, radial, mds, circular, fruchterman, force, dagre各布局详细的配置请参考 [Layout API文档](https://www.yuque.com/antv/g6/agbmu2) |
| groupStyle | Object | | groupStyle 用于指定分组的样式,详情参看[文档](/zh/docs/manual/middle/nodeGroupJ) |
| layout | Object | | 布局配置项,使用 type 字段指定使用的布局方式type可取以下值random, radial, mds, circular, fruchterman, force, dagre各布局详细的配置请参考 [Layout API文档](/zh/docs/api/layout/Layout) |
**重点说明**: G6 3.1 版本中实例化 Graph 时,新增了 `nodeStateStyles`及 `edgeStateStyles`两个配置项,删除了 `nodeStyle``edgeStyle` ,使用 3.1 以下版本的同学,只需要将 `nodeStyle` 改成 `nodeStateStyles`  edgeStyle 改成 `edgeStateStyles` ,配置内容保持不变。
**用法**
Graph 的初始化通过 new 进行实例化,实例化时需要传入需要的参数。
```javascript
const graph = new G6.Graph({
@ -65,11 +67,13 @@ const graph = new G6.Graph({
设置图初始化数据。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| data | Object | true | 初始化的图数据,是一个包括 nodes 和 edges 的对象 |
**用法**
```javascript
const data = {
nodes: [
@ -99,6 +103,7 @@ graph.data(data)
根据提供的数据渲染视图。
**用法**
```javascript
graph.render()
```
@ -107,12 +112,14 @@ graph.render()
根据提供的数据渲染组群。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| data | Object | true | 渲染图的数据 |
| groupType | string | true | group类型支持circle、rect |
**用法**
```javascript
const data = {
nodes: [
@ -154,11 +161,13 @@ graph.renderCustomGroup(data, "circle");
接收数据并进行渲染read 方法的功能相当于 data 和 render 方法的结合。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| data | Object | true | 初始化的图数据,是一个包括 nodes 和 edges 的对象 |
**用法**
```javascript
const data = {
nodes: [
@ -187,12 +196,14 @@ graph.read(data)
更新数据源,根据新的数据重新渲染视图。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| data | Object | true | 初始化的图数据,是一个包括 nodes 和 edges 的对象 |
**用法**
```javascript
const data = {
nodes: [
@ -221,12 +232,14 @@ graph.changeData(data)
收起分组,收起分组后,隐藏分组中的所有节点和边,分组外部与分组内节点有连线的则临时连接到分组上面。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| groupId | String | true | 分组ID |
**用法**
```javascript
graph.collapseGroup('groupId')
```
@ -235,12 +248,14 @@ graph.collapseGroup('groupId')
展开分组,显示分组中的所有节点和边,恢复收起前的连接情况。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| groupId | String | true | 分组ID |
**用法**
```javascript
graph.expandGroup('groupId')
```
@ -250,12 +265,14 @@ graph.expandGroup('groupId')
新增元素。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| type | String | true | 元素类型,可选值为 node、edge 和group |
| model | Object | true | 元素的数据模型type = group 时,参看[这里](https://www.yuque.com/antv/g6/taixri#h8q8H) |
| model | Object | true | 元素的数据模型type = group 时,参看[手动创建节点分组文档](/zh/docs/manual/advanced/create-node-group) |
**用法**
```javascript
const model = {
id: 'node',
@ -291,6 +308,7 @@ graph.addItem('group', model)
更新元素,包括更新数据、样式等。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| item | String | Object | true | 元素 ID 或元素实例 |
@ -298,6 +316,7 @@ graph.addItem('group', model)
**用法**
```javascript
const model = {
id: 'node',
@ -322,11 +341,13 @@ graph.updateItem(item, model)
new删除元素当 item 为 group ID 时候,则删除分组。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| item | String | Object | true | 元素ID或元素实例 |
**用法**
```javascript
// 通过ID查询节点实例
const item = graph.findById('node')
@ -342,6 +363,7 @@ graph.removeItem(item)
该方法无参数。
**用法**
```javascript
graph.refresh()
```
@ -350,12 +372,14 @@ graph.refresh()
刷新指定元素。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| item | String | Object | true | 元素ID或元素实例 |
**用法**
```javascript
// 通过ID查询节点实例
const item = graph.findById('node')
@ -379,6 +403,7 @@ graph.refreshPositions()
该方法无参数。
**用法**
```javascript
const item = e.item;
const graph = this.graph;
@ -396,12 +421,14 @@ graph.setAutoPaint(autoPaint);
设置是否在更新/删除后自动重绘,一般搭配 `paint()` 方法使用。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| auto | Boolean | true | 是否自动重绘 |
**用法**
```javascript
const item = e.item;
const graph = this.graph;
@ -417,12 +444,13 @@ graph.setAutoPaint(autoPaint);
## 布局
G6 3.1 内置了丰富的布局。关于如何使用 G6 中内置的布局,请参考 [Layout API文档](https://www.yuque.com/antv/g6/agbmu2)。
G6 3.1 内置了丰富的布局。关于如何使用 G6 中内置的布局,请参考 [Layout API文档](/zh/docs/api/layout/Layout)。
### layout()
重新以当前配置的属性进行一次布局。
**用法**
```javascript
const graph = new G6.Graph({
container: 'mountNode',
@ -475,12 +503,14 @@ graph.on('node:dragend', e => {
1. 如果参数 `cfg` 中不包含 `type` 字段,则保持原有布局,仅更新布局配置项。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| cfg | Object | true | 新布局配置项 |
**用法**
```javascript
const graph = new G6.Graph({
container: 'mountNode',
@ -515,6 +545,7 @@ graph.updateLayout({
该方法无参数。
**用法**
```javascript
graph.clear()
```
@ -525,6 +556,7 @@ graph.clear()
该方法无参数。
**用法**
```javascript
graph.destroy()
```
@ -534,12 +566,14 @@ graph.destroy()
显示指定的元素。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| item | String | Object | true | 元素ID或元素实例 |
**用法**
```javascript
// 通过ID查询节点实例
const item = graph.findById('nodeId')
@ -553,12 +587,14 @@ graph.showItem('nodeId')
隐藏指定元素。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| item | String | Object | true | 元素ID或元素实例 |
**用法**
```javascript
// 通过ID查询节点实例
const item = graph.findById('nodeId')
@ -574,6 +610,7 @@ graph.hideItem('nodeId')
该方法在执行过程中会触发`beforitemstatechange``afteritemstatechange`事件。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| item | String | Object | true | 元素 ID 或元素实例 |
@ -581,6 +618,7 @@ graph.hideItem('nodeId')
| enabled | Boolean | true | 是否启用状态 |
**用法**
```javascript
graph.setItemState('node1', 'selected', true);
```
@ -589,6 +627,7 @@ graph.setItemState('node1', 'selected', true);
清除元素状态,可以一次性清除多个状态。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| item | String | Object | true | 元素 ID 或元素实例 |
@ -596,6 +635,7 @@ graph.setItemState('node1', 'selected', true);
**用法**
```javascript
// 清除单个状态
graph.clearItemStates(node, 'a');
@ -613,11 +653,13 @@ graph.clearItemStates(node);
提示:该方法必须**在 render 之前调用**,否则不起作用。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| nodeFn | Function | true | 指定每个节点样式 |
**用法**
```javascript
graph.node((node) => {
return {
@ -639,11 +681,13 @@ graph.render()
提示:该方法必须**在 render 之前调用**,否则不起作用。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| edgeFn | Function | true | 指定每条边的样式 |
**用法**
```javascript
graph.edge((edge) => {
return {
@ -664,6 +708,7 @@ graph.render()
新增行为,将单个或多个行为添加到单个或多个模式中。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| behaviors | String | Array | true | 添加的行为的名称 |
@ -671,6 +716,7 @@ graph.render()
**用法**
```javascript
// 将单个Behavior添加到单个模式默认的default模式
graph.addBehaviors('click-select', 'default');
@ -689,6 +735,7 @@ graph.addBehaviors([ 'brush-select', 'click-select' ], ['default', 'select']);
移除行为,将单个或多个行为从单个或多个模式中去除。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| behaviors | String | Array | true | 删除的行为的名称 |
@ -696,6 +743,7 @@ graph.addBehaviors([ 'brush-select', 'click-select' ], ['default', 'select']);
**用法**
```javascript
// 从单个模式中移除单个Behavior
graph.removeBehaviors('click-select', 'default');
@ -714,11 +762,13 @@ graph.removeBehaviors([ 'brush-select', 'click-select' ], ['default', 'select'])
切换图行为模式。主要用于不同模式下的行为切换,如从编辑模式下切换到只读模式。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| mode | String | true | 模式的名称 |
**用法**
```javascript
const graph = new G6.Graph({
container: div,
@ -745,6 +795,7 @@ graph.setMode('custom')
- 返回值表示当前的行为模式。
**用法**
```javascript
// 返回值mode表示当前的行为模式
const mode = graph.getCurrentMode()
@ -761,6 +812,7 @@ const mode = graph.getCurrentMode()
- 返回值表示当前视口的缩放比例, 默认值为 1。
**用法**
```javascript
// 返回值zoom表示当前视口的缩放比例
const zoom = graph.getZoom()
@ -770,12 +822,14 @@ const zoom = graph.getZoom()
改变视口的缩放比例,在当前画布比例下缩放,是相对比例。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| ratio | Number | true | 缩放比例 |
| center | Object | false | 以 center 的 x、y 坐标为中心缩放,如果省略了 center 参数,则以元素当前位置为中心缩放 |
**用法**
```javascript
// 以(100, 100)为中心点放大3倍
graph.zoom(3, { x: 100, y: 100 });
@ -788,6 +842,7 @@ graph.zoom(0.5)
缩放视窗窗口到一个固定比例。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| toRatio | Number | true | 固定比例值 |
@ -795,6 +850,7 @@ graph.zoom(0.5)
**用法**
```javascript
// 以(100, 100)为中心点放大3倍
graph.zoomTo(3, { x: 100, y: 100 });
@ -807,12 +863,14 @@ graph.zoomTo(0.5)
将元素移动到视口中心,该方法可用于做搜索后的缓动动画。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| item | String | Object | true | 元素 ID 或元素实例 |
**用法**
```javascript
graph.focusItem(item)
```
@ -821,6 +879,7 @@ graph.focusItem(item)
改变画布大小。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| width | Number | true | 画布宽度 |
@ -828,6 +887,7 @@ graph.focusItem(item)
**用法**
```javascript
graph.changeSize(600, 350)
```
@ -836,6 +896,7 @@ graph.changeSize(600, 350)
采用**相对位移**来平移画布。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| dx | Number | true | 水平方向位移 |
@ -843,6 +904,7 @@ graph.changeSize(600, 350)
**用法**
```javascript
graph.translate(100, 100);
```
@ -851,6 +913,7 @@ graph.translate(100, 100);
采用**绝对位移**将画布移动到指定坐标。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| x | Number | true | 水平方向坐标 |
@ -858,6 +921,7 @@ graph.translate(100, 100);
**用法**
```javascript
graph.moveTo(200, 300)
```
@ -866,12 +930,14 @@ graph.moveTo(200, 300)
让画布内容适应视口。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| padding | Number | Array | false | [top, right, bottom, left] 四个方向上的间距值 |
**用法**
```javascript
// padding只设置为一个值则表示top = right = bottom = left = 20
graph.fitView(20)
@ -891,6 +957,7 @@ graph.fitView([20, 10, 20, 15])
根据具体规则查找单个元素。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| type | String | true | 元素类型,可选值为 node、edge |
@ -903,6 +970,7 @@ graph.fitView([20, 10, 20, 15])
- 如果有符合规则的元素实例,则返回第一个匹配的元素实例,否则返回 `undefined`
**用法**
```javascript
const findNode = graph.find('node', node => {
return node.get('model').x === 100;
@ -913,6 +981,7 @@ const findNode = graph.find('node', node => {
根据 ID查询对应的元素实例。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| id | String | true | 元素 ID |
@ -924,6 +993,7 @@ const findNode = graph.find('node', node => {
- 如果有符合规则的元素实例,则返回该元素实例,否则返回 `undefined`
**用法**
```javascript
const node = graph.findById('node')
```
@ -932,6 +1002,7 @@ const node = graph.findById('node')
查询所有满足规则的元素。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| type | String | true | 元素类型,可选值为 node、edge |
@ -944,6 +1015,7 @@ const node = graph.findById('node')
- 如果有符合规则的元素实例,则返回所有元素实例,否则返回 `undefined`
**用法**
```javascript
const nodes = graph.findAll('node', node => {
return node.get('model').x;
@ -954,6 +1026,7 @@ const nodes = graph.findAll('node', node => {
查找所有处于指定状态的元素。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| type | String | true | 元素类型,可选值为 node、edge |
@ -966,6 +1039,7 @@ const nodes = graph.findAll('node', node => {
- 返回所有指定状态的元素实例。
**用法**
```javascript
// 查询所有选中的元素
const nodes = graph.findAllByState('node', 'selected');
@ -990,6 +1064,7 @@ const nodes = graph.findAllByState('node', 'selected');
```
**用法**
```javascript
graph.save()
```
@ -1005,6 +1080,7 @@ graph.save()
- 返回值表示图中所有节点的实例。
**用法**
```javascript
const nodes = graph.getNodes()
```
@ -1020,16 +1096,21 @@ const nodes = graph.getNodes()
- 返回值表示图中所有边的实例。
**用法**
```javascript
const edges = graph.getEdges()
```
## 坐标转换
这部分主要是说明视口坐标、Canvas 坐标和页面坐标之前的相互转换。其中视口坐标和 Canvas 坐标的示意图如下所示。<br />![image.png](https://cdn.nlark.com/yuque/0/2019/png/244306/1561032531743-bd0ad563-e0e3-47ec-912b-8d95d200aee6.png#align=left&display=inline&height=535&name=image.png&originHeight=1070&originWidth=1128&search=&size=320637&status=done&width=564)
这部分主要是说明视口坐标、Canvas 坐标和页面坐标之前的相互转换。其中视口坐标和 Canvas 坐标的示意图如下所示。
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*loahSq940hMAAAAAAAAAAABkARQnAQ' width=565 />
### getPointByClient(clientX, clientY)
将屏幕/页面坐标转换为视口坐标。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| clientX | Number | true | 屏幕 x 坐标 |
@ -1042,6 +1123,7 @@ const edges = graph.getEdges()
- 包含的属性x 和 y 属性,分别表示视口的 x 、y 坐标。
**用法**
```javascript
const point = graph.getPointByClient(e.clientX, e.clientY);
console.log('视口x/y坐标分别为:', point.x, point.y)
@ -1051,6 +1133,7 @@ console.log('视口x/y坐标分别为:', point.x, point.y)
将视口坐标转换为屏幕/页面坐标。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| x | Number | true | 视口 x 坐标 |
@ -1063,6 +1146,7 @@ console.log('视口x/y坐标分别为:', point.x, point.y)
- 包含的属性x 和 y 属性,分别表示屏幕/页面的 x、y 坐标。
**用法**
```javascript
const point = graph.getClientByPoint(100, 200);
console.log('屏幕/页面x/y坐标分别为:', point.x, point.y)
@ -1072,6 +1156,7 @@ console.log('屏幕/页面x/y坐标分别为:', point.x, point.y)
将 Canvas 画布坐标转换为视口坐标。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| canvasX | Number | true | 画布x坐标 |
@ -1084,6 +1169,7 @@ console.log('屏幕/页面x/y坐标分别为:', point.x, point.y)
- 包含的属性x 和 y 属性,分别表示视口的 x、y 坐标。
**用法**
```javascript
const point = graph.getPointByCanvas(100, 200);
console.log('视口x/y坐标分别为:', point.x, point.y)
@ -1093,6 +1179,7 @@ console.log('视口x/y坐标分别为:', point.x, point.y)
将视口坐标转换为 Canvas 画布坐标。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| x | Number | true | 视口 x 坐标 |
@ -1105,6 +1192,7 @@ console.log('视口x/y坐标分别为:', point.x, point.y)
- 包含的属性x 和 y 属性,分别表示 Canvas 画布的 x、y 坐标。
**用法**
```javascript
const point = graph.getCanvasByPoint(100, 200);
console.log('Canvas画布的x/y坐标分别为:', point.x, point.y)
@ -1118,6 +1206,7 @@ console.log('Canvas画布的x/y坐标分别为:', point.x, point.y)
停止画布上的所有动画。
**用法**
```javascript
graph.stopAnimate()
```
@ -1130,12 +1219,14 @@ graph.stopAnimate()
添加指定的插件。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| plugin | Object | true | 插件实例 |
**用法**
```javascript
import miniMap from '@antv/g6/build/minimap'
graph.Plugin(miniMap)
@ -1145,12 +1236,14 @@ graph.Plugin(miniMap)
移除指定的插件。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| plugin | Object | true | 插件实例 |
**用法**
```javascript
import miniMap from '@antv/g6/build/minimap'
graph.removePlugin(miniMap)
@ -1160,12 +1253,14 @@ graph.removePlugin(miniMap)
根据key获取属性值。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| key | String | true | 属性的键 |
**用法**
```javascript
// 获取group
const group = graph.get('group')
@ -1181,6 +1276,7 @@ const autoPaint = graph.get('autoPaint')
设置属性值。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| key | String | true | 属性的键 |
@ -1188,6 +1284,7 @@ const autoPaint = graph.get('autoPaint')
**用法**
```javascript
// 设置capture值为false
graph.set('capture', false)
@ -1203,11 +1300,13 @@ graph.set('nodeIdList', [1, 3, 5])
将画布上的元素导出为图片。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| name | String | true | 图片的名称 |
**用法**
```javascript
graph.downloadImage()
```
@ -1221,6 +1320,7 @@ graph.downloadImage()
- 返回值表示生成的图片的 URL。
**用法**
```javascript
const dataURL = graph.toDataURL()
```

View File

@ -6,6 +6,7 @@ order: 2
TreeGraph是G6专门为树图场景打造的图。TreeGraph继承自Graph。`G6.TreeGraph`与`G6.Graph`最大的区别就是数据结构和内置布局计算。主要出于以下考虑:
- 数据结构树图的数据一般是嵌套结构边的数据隐含在嵌套结构中并不会特意指定edge。此布局要求数据中一个节点需要有`id`和`children`两个数据项,最精简的数据结构如下所示:
```javascript
const data = {
id: 'root',
@ -32,6 +33,7 @@ const data = {
### G6.TreeGraph
**参数**
| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| layout | object | null | **3.0.4 版本开始支持树布局算法配置**。3.0.4 版本之前是 function 形式。建议开发者使用配置形式,操作粒度更细。 |
@ -39,6 +41,7 @@ const data = {
**用法**
```javascript
const treeGraph = new G6.TreeGraph({
container: 'mountNode',
@ -73,6 +76,7 @@ layout目前支持dendrogram、compactBox、mindmap和indeted四种布局方式
### 通用配置项
| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| type | string | dendrogram | 布局类型支持dendrogram、compactBox、mindmap和indeted。 |
@ -85,18 +89,20 @@ layout目前支持dendrogram、compactBox、mindmap和indeted四种布局方式
### dendrogram
**dendrogram示意图**
使用`dendrogram`方式布局时,`direction`取不同值时的效果如下所示。
| LR | RL | H |
| --- | --- | --- |
| <img src='https://intranetproxy.alipay.com/skylark/lark/0/2019/png/178530/1560909423150-acf04d11-7016-49ae-a888-f90edb96adbd.png#align=left&display=inline&percent=0&size=0&status=done' width='230' height='100'> | <img src='https://intranetproxy.alipay.com/skylark/lark/0/2019/png/178530/1560909423566-cca49639-6dab-43d0-bfac-5ed9b9197237.png#align=left&display=inline&percent=0&size=0&status=done' width='230' height='100'> | <img src='https://intranetproxy.alipay.com/skylark/lark/0/2019/png/178530/1560909423225-ad3bb9b4-2119-4014-ae98-65e02185e95e.png#align=left&display=inline&percent=0&size=0&status=done' width='230' height='100'> |
| <img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*zX7tSLqBvwcAAAAAAAAAAABkARQnAQ' width='230' height='100'> | <img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*qVbeR4oq4lYAAAAAAAAAAABkARQnAQ' width='230' height='100'> | <img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*OHetRqedHOkAAAAAAAAAAABkARQnAQ' width='230' height='100'> |
| TB | BT | V |
| --- | --- | --- |
| <img src='https://intranetproxy.alipay.com/skylark/lark/0/2019/png/178530/1560909422368-c7b8499f-053b-497f-ad34-f45b8c2a5549.png#align=left&display=inline&percent=0&size=0&status=done' width='230' height='100'> | <img src='https://intranetproxy.alipay.com/skylark/lark/0/2019/png/178530/1560909422252-07a6933e-93d8-490e-ae15-ed51e576d69a.png#align=left&display=inline&percent=0&size=0&status=done' width='230' height='100'> | <img src='https://intranetproxy.alipay.com/skylark/lark/0/2019/png/178530/1560909422727-f14a4f4c-c326-4f3f-bea5-abae28867835.png#align=left&display=inline&percent=0&size=0&status=done' width='230' height='100'> |
| <img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*P_OETZsj17cAAAAAAAAAAABkARQnAQ' width='230' height='100'> | <img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*n6sFS57g424AAAAAAAAAAABkARQnAQ' width='230' height='100'> | <img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*CyVbQ5q_0_cAAAAAAAAAAABkARQnAQ' width='230' height='100'> |
**dendrogram配置项**
| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| nodeSep | number | 20 | 同层次节点之间的间距 |
@ -109,18 +115,20 @@ layout目前支持dendrogram、compactBox、mindmap和indeted四种布局方式
### compactBox
**compactBox示意图**
使用`compactBox`方式布局时,`direction`取不同值时的效果如下所示。
| LR | RL | H |
| --- | --- | --- |
| <img src='https://intranetproxy.alipay.com/skylark/lark/0/2019/png/178530/1560909250873-b6b156b5-8edc-468c-bd8e-e1336a0c4589.png#align=left&display=inline&percent=0&size=0&status=done' width='230' height='100'> | <img src='https://intranetproxy.alipay.com/skylark/lark/0/2019/png/178530/1560909251752-c5fef594-c0d5-4e0f-80e0-50ef0ad030d7.png#align=left&display=inline&percent=0&size=0&status=done' width='230' height='100'> | <img src='https://intranetproxy.alipay.com/skylark/lark/0/2019/png/178530/1560909252469-d1429897-cbe0-4d1f-933e-f1da998e5057.png#align=left&display=inline&percent=0&size=0&status=done' width='230' height='100'> |
| <img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*z-ESRoHTpvIAAAAAAAAAAABkARQnAQ' width='230' height='100'> | <img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*AHfiQ7IfWJwAAAAAAAAAAABkARQnAQ' width='230' height='100'> | <img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*Ygp0RaTxjp8AAAAAAAAAAABkARQnAQ' width='230' height='100'> |
| TB | BT | V |
| --- | --- | --- |
| <img src='https://intranetproxy.alipay.com/skylark/lark/0/2019/png/178530/1560909252526-b8936ca5-0c10-475e-a695-c10d6719a9cf.png#align=left&display=inline&percent=0&size=0&status=done' width='230' height='100'> | <img src='https://intranetproxy.alipay.com/skylark/lark/0/2019/png/178530/1560909253376-12485bcb-cf79-4036-9e34-9d8310622071.png#align=left&display=inline&percent=0&size=0&status=done' width='230' height='100'> | <img src='https://intranetproxy.alipay.com/skylark/lark/0/2019/png/178530/1560909250963-09c4db6e-5f67-49ea-a0ce-b922ad54548d.png#align=left&display=inline&percent=0&size=0&status=done' width='230' height='100'> |
| <img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*sj6qSqrBvpIAAAAAAAAAAABkARQnAQ' width='230' height='100'> | <img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*4tDzSpYiq-cAAAAAAAAAAABkARQnAQ' width='230' height='100'> | <img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*Mj0WSaTKzSsAAAAAAAAAAABkARQnAQ' width='230' height='100'> |
**compactBox配置项**
| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| getId | Function | | 指定节点ID |
@ -152,6 +160,7 @@ layout目前支持dendrogram、compactBox、mindmap和indeted四种布局方式
### indented
**indented示意图**
使用`indented`方式布局时,`direction`取不同值时的效果如下所示。
| LR | RL | H |
@ -160,6 +169,7 @@ layout目前支持dendrogram、compactBox、mindmap和indeted四种布局方式
**indented配置项**
| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| indent | number | 20 | 与直接父节点的缩进值 |
@ -170,10 +180,11 @@ layout目前支持dendrogram、compactBox、mindmap和indeted四种布局方式
### mindmap
**mindmap示意图**
<img src='https://intranetproxy.alipay.com/skylark/lark/0/2019/png/178530/1560908396116-af8c9bf3-ec9b-4a06-b32a-9c6be6ee927c.png#align=left&display=inline&height=327&name=image.png&originHeight=654&originWidth=1276&size=112648&status=done&width=638' width='750'>
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*J1l5RofvbP0AAAAAAAAAAABkARQnAQ' width='750'>
**mindmap配置项**
| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| getId | Function | | 指定节点ID |
@ -190,8 +201,8 @@ layout目前支持dendrogram、compactBox、mindmap和indeted四种布局方式
### addChild(data, parent)
在指定的父节点下添加子树。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| data | object | true | 子树的数据 |
@ -199,6 +210,7 @@ layout目前支持dendrogram、compactBox、mindmap和indeted四种布局方式
**用法**
```javascript
const data = {
id: 'sub1',
@ -217,12 +229,12 @@ const data = {
treeGraph.addChild(data, 'root')
```
### updateChild(data, parent)
更新数据,差量更新子树。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| data | object | true | 子树的数据 |
@ -230,8 +242,8 @@ treeGraph.addChild(data, 'root')
⚠️**注意:**当parent参数为空时则全量更新。
**用法**
```javascript
const data = {
id: 'sub1',
@ -250,18 +262,19 @@ const data = {
treeGraph.updateChild(data, 'root')
```
### removeChild(id)
删除指定的子树。
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| id | string | true | 要删除的子树的ID |
**用法**
```javascript
treeGraph.removeChild('sub')
```
@ -274,12 +287,14 @@ treeGraph.removeChild('sub')
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| layout | object | false | 指定的布局配置,如不传,则不做变更 |
**用法**
```javascript
const layout = {
type: 'mindmap',
@ -298,12 +313,14 @@ treeGraph.changeLayout(layout)
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| fitView | boolean | false | 更新布局后,是否需要自适应窗口 |
**用法**
```javascript
treeGraph.refreshLayout(true)
```
@ -316,6 +333,7 @@ treeGraph.refreshLayout(true)
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| id | string | true | 指定的元素ID |
@ -329,6 +347,7 @@ treeGraph.refreshLayout(true)
**用法**
```javascript
const target = {
id: 'sub1',

558
docs/api/layout/Graph.zh.md Normal file
View File

@ -0,0 +1,558 @@
---
title: Graph Layout
order: 1
---
## Random
Random 布局是 G6 中的默认布局方法。当实例化图时没有指定布局方法且数据中也不存在位置信息时G6 将自动使用 Random 布局。
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*G5_uRodUTaYAAAAAAAAAAABkARQnAQ' width=430 />
### 属性
#### center
**类型** Array<br />**示例**[ 0, 0 ]<br />**默认值**:图的中心<br />**是否必须**false<br />**说明**:布局的中心
#### width
**类型** Number<br />**默认值**:图的宽度<br />**是否必须**false<br />**说明**:布局的宽度范围
#### height
**类型** Number<br />**默认值**:图的高度<br />**是否必须**false<br />**说明**:布局的高度范围
### 方法
与父类 Layout 的方法相同。使用该布局时不需要关心内部方法的调用,由 G6 控制。
### 使用方法
实例化图时配置到 `layout` 中,如果没有配置 `layout` 默认使用 Random 布局。
```javascript
const graph = new G6.Graph({
container: 'mountNode',
width: 1000,
height: 600,
layout: {
type: 'random',
width: 300,
height: 300
}
);
```
## MDS
MDS 布局是高维数据降维算法布局该算法全称 Multidimensional scaling <br />
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*aUS7TJR2NHcAAAAAAAAAAABkARQnAQ' width=600 />
### 属性
#### center
**类型** Array<br />**示例**[ 0, 0 ]<br />**默认值**:图的中心<br />**是否必须**false<br />**说明**:布局的中心
#### linkDistance
**类型** Number<br />**默认值**50<br />**是否必须**false<br />**说明**:边长度
### 方法
与父类 Layout 的方法相同。使用该布局时不需要关心内部方法的调用,由 G6 控制。
### 使用方法
实例化图时配置到 `layout` 中,如果没有配置 `layout` 默认使用 Random 布局。
```javascript
const graph = new G6.Graph({
container: 'mountNode',
width: 1000,
height: 600,
layout: {
type: 'mds'
}
);
```
## Force
Force 布局经典的力导向布局方法,与 d3 的力导向布局方法相对应。其属性也与 d3 的力道布局参数相对应。
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*Nt45Q6nnK2wAAAAAAAAAAABkARQnAQ' width=600 />
### 属性
#### center
**类型** Array<br />**示例**[ 0, 0 ]<br />**默认值**:图的中心<br />**是否必须**false<br />**说明**:布局的中心
#### linkDistance
**类型** Number<br />**默认值**50<br />**是否必须**false<br />**说明**:边长度
#### nodeStrength
**类型** Number<br />**默认值**null<br />**是否必须**false<br />**说明**:节点作用力,正数代表节点之间的引力作用,负数代表节点之间的斥力作用
#### edgeStrength
**类型**Number<br />**默认值**null<br />**是否必须**false<br />**说明**:边的作用力,默认根据节点的出入度自适应
#### collideStrength
**类型**Number<br />**默认值**1<br />**是否必须**false<br />**说明**:防止重叠的力强度,范围 [0, 1]
#### nodeSize
**类型** Number<br />**默认值**10<br />**是否必须**false<br />**说明**:节点大小(直径)。用于碰撞检测。若不指定,则根据传入的节点的 size 属性计算。若即不指定,即节点中也没有 `size`,则默认大小为 10
#### alpha
**类型**Number<br />**默认值**0.3<br />**是否必须**false<br />**说明**:当前的迭代收敛阈值
#### alphaDecay
**类型**Number<br />**默认值**0.028<br />**是否必须**false<br />**说明**:迭代阈值的衰减率。[0, 1]0.028 对应迭代书为 300
#### alphaMin
**类型**Number<br />**默认值**0.001<br />**是否必须**false<br />**说明**:停止迭代的阈值
#### forceSimulation
**类型**Object<br />**默认值**null<br />**是否必须**false<br />**说明**:自定义 force 方法,若不指定,则使用 d3 的方法
#### onTick
**类型**Function<br />**默认值**{}<br />**是否必须**false<br />**说明**:每一次迭代的回调函数
#### onLayoutEnd
**类型**Function<br />**默认值**{}<br />**是否必须**false<br />**说明**:布局完成后的回调函数
### 方法
与父类 Layout 的方法相同。使用该布局时不需要关心内部方法的调用,由 G6 控制。
### 使用方法
实例化图时配置到 `layout` 中,如果没有配置 `layout` 默认使用 Random 布局。
```javascript
const graph = new G6.Graph({
container: 'mountNode',
width: 1000,
height: 600,
layout: {
type: 'force',
center: [ 200, 200 ], // 可选,默认为图的中心
linkDistance: 50, // 可选,边长
nodeStrength: 30, // 可选
edgeStrength: 0.1, // 可选
collideStrength: 0.8, // 可选
nodeSize: 30, // 可选
alpha: 0.3, // 可选
alphaDecay: 0.028, // 可选
alphaMin: 0.01, // 可选
forceSimulation: null, // 可选
onTick: () => { // 可选
console.log('ticking');
},
onLayoutEnd: () => { // 可选
console.log('force layout done');
}
}
);
```
## Fruchterman
Fruchterman 布局是一种力导布局。算法原文:[Graph Drawing by Force-directed Placement](http://www.mathe2.uni-bayreuth.de/axel/papers/reingold:graph_drawing_by_force_directed_placement.pdf)。
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*jK3ITYqVJnQAAAAAAAAAAABkARQnAQ' width=600 />
### 属性
#### center
**类型** Array<br />**示例**[ 0, 0 ]<br />**默认值**:图的中心<br />**是否必须**false<br />**说明**:布局的中心
#### maxIteration
**类型** Number<br />**默认值**1000<br />**是否必须**false<br />**说明**:最大迭代次数
#### gravity
**类型** Number<br />**默认值**10<br />**是否必须**false<br />**说明**:重力的大小,影响布局的紧凑程度
#### speed
**类型** Number<br />**默认值**1<br />**是否必须**false<br />**说明**:每次迭代节点移动的速度。速度太快可能会导致强烈震荡
#### clustering
**类型** Boolean<br />**默认值**false<br />**是否必须**false<br />**说明**:是否按照聚类布局
#### clusterGravity
**类型** Number<br />**默认值**10<br />**是否必须**false<br />**说明**:聚类内部的重力大小,影响聚类的紧凑程度,在 `clustering``true` 时生效
### 方法
与父类 Layout 的方法相同。使用该布局时不需要关心内部方法的调用,由 G6 控制。
### 使用方法
实例化图时配置到 `layout` 中,如果没有配置 `layout` 默认使用 Random 布局。
```javascript
const graph = new G6.Graph({
container: 'mountNode',
width: 1000,
height: 600,
layout: {
type: 'fruchterman',
center: [ 200, 200 ], // 可选,默认为图的中心
gravity: 20, // 可选
speed: 2, // 可选
clustering: true, // 可选
clusterGravity: 30, // 可选
maxIteration: 2000
}
);
```
## Circular
Circular 布局将所有节点布局在一个圆环上,可以选择节点在圆环上的排列顺序。可以通过参数的配置扩展出环的分组布局、螺旋形布局等。原文链接:[A framework and algorithms for circular drawings of graphs]()。<br />
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*-3idTK1xa6wAAAAAAAAAAABkARQnAQ' width=270 />
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*_nLORItzM5QAAAAAAAAAAABkARQnAQ' width=270 />
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*6J6BRIjmXKAAAAAAAAAAAABkARQnAQ' width=270 />
### 属性
#### center
**类型** Array<br />**示例**[ 0, 0 ]<br />**默认值**:图的中心<br />**是否必须**false<br />**说明**:布局的中心
#### radius
**类型** Number<br />**默认值**null<br />**是否必须**false<br />**说明**:圆的半径。若设置了 radius则 startRadius 与 endRadius 不生效
#### startRadius
**类型** Number<br />**默认值**null<br />**是否必须**false<br />**说明**:螺旋状布局的起始半径
#### endRadius
**类型**Number<br />**默认值**null<br />**是否必须**false<br />**说明**:螺旋状布局的结束半径
#### clockwise
**类型**Boolean<br />**默认值**true<br />**是否必须**false<br />**说明**:是否顺时针排列
#### divisions
**类型**Number<br />**默认值**1<br />**是否必须**false<br />**说明**:节点在环上的分段数(几个段将均匀分布),在 endRadius - startRadius != 0 时生效
#### ordering
**类型**String<br />**默认值**false<br />**可选值**null | 'topology' | 'degree'<br />**是否必须**false<br />**说明**:节点在环上排序的依据。默认 null 代表直接使用数据中的顺序。'topology' 按照拓扑排序。'degree' 按照度数大小排序
#### angleRatio
**类型** Number<br />**默认值**1<br />**是否必须**false<br />**说明**:从第一个节点到最后节点之间相隔多少个 2*PI
### 方法
与父类 Layout 的方法相同。使用该布局时不需要关心内部方法的调用,由 G6 控制。
### 使用方法
实例化图时配置到 `layout` 中,如果没有配置 `layout` 默认使用 Random 布局。
```javascript
const graph = new G6.Graph({
container: 'mountNode',
width: 1000,
height: 600,
layout: {
type: 'circular',
center: [ 200, 200 ], // 可选,默认为图的中心
radius: null, // 可选
startRadius: 10, // 可选
endRadius: 100, // 可选
clockwise: false, // 可选
divisions: 5, // 可选
ordering: 'degree', // 可选
angleRatio: 1 // 可选
}
);
```
## Radial
Radial 布局是将图布局成辐射状的布局方法。以一个 focusNode 为中心,其余节点按照与 focusNode 的度数关系排列在不同距离的环上。距离 focusNode 一度的节点布局在与其最近的第一个环上,距离 focusNode 二度的节点布局在第二个环上,以此类推。算法原文链接:[More Flexible Radial Layout](http://emis.ams.org/journals/JGAA/accepted/2011/BrandesPich2011.15.1.pdf)。
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*GAFjRJeAoAsAAAAAAAAAAABkARQnAQ' width=600 />
### 属性
#### center
**类型** Array<br />**示例**[ 0, 0 ]<br />**默认值**:图的中心<br />**是否必须**false<br />**说明**:布局的中心
#### linkDistance
**类型** Number<br />**默认值**50<br />**是否必须**false<br />**说明**:边长度
#### maxIteration
**类型** Number<br />**默认值**1000<br />**是否必须**false<br />**说明**:停止迭代到最大迭代数
#### focusNode
**类型**String | Object<br />**默认值**null<br />**是否必须**false<br />**说明**:辐射的中心点,默认为数据中第一个节点。可以传入节点 id 或节点本身
#### unitRadius
**类型**Number<br />**默认值**100<br />**是否必须**false<br />**说明**:每一圈距离上一圈的距离。默认填充整个画布,即根据图的大小决定
#### preventOverlap
**类型**Boolean<br />**默认值**false<br />**是否必须**false<br />**说明**:是否防止重叠,必须配合下面属性 [`nodeSize`](#xWjHN) ,只有设置了与当前图节点大小相同的 `nodeSize` 值,才能够进行节点重叠的碰撞检测
#### nodeSize
**类型** Number<br />**默认值**10<br />**是否必须**false<br />**说明**:节点大小(直径)。用于防止节点重叠时的碰撞检测
#### maxPreventOverlapIteration
**类型** Number<br />**默认值**200<br />**是否必须**false<br />**说明**:防止重叠步骤的最大迭代次数
#### strictRadial
**类型** Boolean<br />**默认值**true<br />**是否必须**false<br />**说明**:是否必须是严格的 radial 布局,及每一层的节点严格布局在一个环上。`preventOverlap` 为 `true` 时生效。
- 当 `preventOverlap``true`,且 `strictRadial``false` 时,有重叠的节点严格沿着所在的环展开,但在一个环上若节点过多,可能无法完全避免节点重叠。
- 当 `preventOverlap``true`,且 `strictRadial``true` 时,允许同环上重叠的节点不严格沿着该环布局,可以在该环的前后偏移以避免重叠。
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*cJqbRqm0h2UAAAAAAAAAAABkARQnAQ' width=270 />
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*PFRIRosyX7kAAAAAAAAAAABkARQnAQ' width=270 />
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*DPQFSqCXaIAAAAAAAAAAAABkARQnAQ' width=270 />
> preventOverlap = false。preventOverlap = falsestrictRadial = true。preventOverlap = falsestrictRadial = false。
### 方法
与父类 Layout 的方法相同。使用该布局时不需要关心内部方法的调用,由 G6 控制。
### 使用方法
实例化图时配置到 `layout` 中,如果没有配置 `layout` 默认使用 Concentric 布局。
```javascript
const graph = new G6.Graph({
container: 'mountNode',
width: 1000,
height: 600,
layout: {
type: 'circular',
center: [ 200, 200 ], // 可选,默认为图的中心
linkDistance: 50, // 可选,边长
maxIteration: 1000, // 可选
focusNode: 'node11', // 可选
unitRadius: 100, // 可选
preventOverlap: true, // 可选,必须配合 nodeSize
nodeSize: 30, // 可选
strictRadial: false // 可选
}
);
```
## Dagre
Dagre 是一种层次布局。
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*2uMmRo5wYPUAAAAAAAAAAABkARQnAQ' width=600 />
### 属性
#### rankdir
**类型** String<br />**可选值**'TB' | 'BT' | 'LR' | 'RL'<br />**默认值**'TB'<br />**是否必须**false<br />**说明**布局的方向。TtopBbottomLleftRright
- 'TB':从上至下布局;
- 'BT':从下至上布局;
- 'LR':从左至右布局;
- 'RL':从右至左布局。
<br />
#### align
**类型** String<br />**可选值**'UL' | 'UR' | 'DL' | 'DR'<br />**默认值**'UL'<br />**是否必须**false<br />**说明**节点对齐方式。UupperDdownLleftRright
- 'UL':对齐到左上角;
- 'UR':对齐到右上角;
- 'DL':对齐到左下角;
- 'DR':对齐到右下角。
#### nodesep
**类型** Number<br />**默认值**50<br />**是否必须**false<br />**说明**节点间距px
#### ranksep
**类型** Number<br />**默认值**50<br />**是否必须**false<br />**说明**层间距px
#### controlPoints
**类型** Boolean<br />**默认值**true<br />**是否必须**false<br />**说明**:是否保留布局连线的控制点
### 方法
与父类 Layout 的方法相同。使用该布局时不需要关心内部方法的调用,由 G6 控制。
### 使用方法
实例化图时配置到 `layout` 中,如果没有配置 `layout` 默认使用 Random 布局。
```javascript
const graph = new G6.Graph({
container: 'mountNode',
width: 1000,
height: 600,
layout: {
type: 'dagre',
rankdir: 'LR', // 可选,默认为图的中心
align: 'DL', // 可选
nodesep: 20, // 可选
ranksep: 50, // 可选
controlPoints: true // 可选
}
);
```
## Concentric
Concentric 布局为同心圆布局,用户可以指定节点某个属性为排序依据(默认为节点度数 degree该属性值越高则该节点布局后的位置中心。
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*QpyPTbBpO2AAAAAAAAAAAABkARQnAQ' width=600 />
### 属性
#### center
**类型** Array<br />**示例**[ 0, 0 ]<br />**默认值**:图的中心<br />**是否必须**false<br />**说明**:布局的中心
#### preventOverlap
**类型**Boolean<br />**默认值**false<br />**是否必须**false<br />**说明**:是否防止重叠,必须配合下面属性 [`nodeSize`](https://www.yuque.com/antv/g6/ngp0vg#xWjHN) ,只有设置了与当前图节点大小相同的 `nodeSize` 值,才能够进行节点重叠的碰撞检测
#### nodeSize
**类型** Number<br />**默认值**30<br />**是否必须**false<br />**说明**:节点大小(直径)。用于防止节点重叠时的碰撞检测
#### minNodeSpacing
**类型** Number<br />**默认值**10<br />**是否必须**false<br />**说明**:环与环之间最小间距,用于调整半径
#### sweep
**类型** Number<br />**默认值**undefined<br />**是否必须**false<br />**说明**:第一个节点与最后一个节点之间的弧度差。若为 undefined 则将会被设置为 2 * Math.PI * (1 - 1 / |level.nodes|) ,其中 level.nodes 为该算法计算出的每一层的节点,|level.nodes| 代表该层节点数量
#### equidistant
**类型** Boolean<br />**默认值**false<br />**是否必须**false<br />**说明**:环与环之间的距离是否相等
#### startAngle
**类型** Number<br />**默认值**3 / 2 * Math.PI<br />**是否必须**false<br />**说明**:开始方式节点的弧度
#### clockwise
**类型** Boolean<br />**默认值**false<br />**是否必须**false<br />**说明**:是否按照顺时针排列
#### maxLevelDiff
**类型** Number<br />**默认值:**undefined<br />**是否必须**false<br />**说明**:每一层同心值的求和。若为 undefined则将会被设置为 maxValue / 4 ,其中 maxValue 为最大的排序依据的属性值。例如,若 sortBy='degree',则 maxValue 为所有节点中度数最大的节点的度数
#### sortBy
**类型** String<br />**默认值**undefined<br />**是否必须**false<br />**说明**:指定排序的依据(节点属性名),数值越高则该节点被放置得越中心。若为 undefined则会计算节点的度数度数越高节点将被放置得越中心
### 方法
与父类 Layout 的方法相同。使用该布局时不需要关心内部方法的调用,由 G6 控制。
### 使用方法
实例化图时配置到 `layout` 中,如果没有配置 `layout` 默认使用 Random 布局。
```javascript
const graph = new G6.Graph({
container: 'mountNode',
width: 1000,
height: 600,
layout: {
type: 'concentric',
center: [ 200, 200 ], // 可选,
linkDistance: 50, // 可选,边长
preventOverlap: true, // 可选,必须配合 nodeSize
nodeSize: 30, // 可选
sweep: 10, // 可选
equidistant: false, // 可选
startAngle: 0, // 可选
clockwise: false, // 可选
maxLevelDiff: 10, // 可选
sortBy: 'degree' // 可选
}
);
```
## Grid
Grid 布局是将所有节点通过某种指定属性排序后,整齐地放置在网格上。
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*Oh6mRLVEBBIAAAAAAAAAAABkARQnAQ' width=850 />
### 属性
#### begin
**类型** Array<br />**示例**[ 0, 0 ]<br />**默认值**[ 0, 0 ]<br />**是否必须**false<br />**说明**:网格开始位置(左上角)
#### preventOverlap
**类型**Boolean<br />**默认值**false<br />**是否必须**false<br />**说明**:是否防止重叠,必须配合下面属性 [`nodeSize`](https://www.yuque.com/antv/g6/ngp0vg#xWjHN) ,只有设置了与当前图节点大小相同的 `nodeSize` 值,才能够进行节点重叠的碰撞检测
#### nodeSize
**类型** Number<br />**默认值**30<br />**是否必须**false<br />**说明**:节点大小(直径)。用于防止节点重叠时的碰撞检测
#### preventOverlapPadding
**类型**Number<br />**默认值**10<br />**是否必须**false<br />**说明**:避免重叠时节点的间距 padding。preventOverlap 为 true 时生效
#### condense
**类型** Boolean<br />**默认值**false<br />**是否必须**false<br />**说明**:为 false 时表示利用所有可用画布空间,为 true 时表示利用最小的画布空间
#### rows
**类型** Number<br />**默认值**undefined<br />**是否必须**false<br />**说明**:网格的行数,为 undefined 时算法根据节点数量、布局空间、cals若指定自动计算
#### cols
**类型** Number<br />**默认值**undefined<br />**是否必须**false<br />**说明**:网格的列数,为 undefined 时算法根据节点数量、布局空间、rows若指定自动计算
#### sortBy
**类型** String<br />**默认值**undefined<br />**是否必须**false<br />**说明**:指定排序的依据(节点属性名),数值越高则该节点被放置得越中心。若为 undefined则会计算节点的度数度数越高节点将被放置得越中心
### 方法
与父类 Layout 的方法相同。使用该布局时不需要关心内部方法的调用,由 G6 控制。
### 使用方法
实例化图时配置到 `layout` 中,如果没有配置 `layout` 默认使用 Grid 布局。
```javascript
const graph = new G6.Graph({
container: 'mountNode',
width: 1000,
height: 600,
layout: {
type: 'concentric',
begin: [ 0, 0 ], // 可选,
preventOverlap: true, // 可选,必须配合 nodeSize
preventOverlapPdding: 20, // 可选
nodeSize: 30, // 可选
condense: false, // 可选
rows: 5, // 可选
cols: 5, // 可选
sortBy: 'degree' // 可选
}
);
```

View File

@ -1,6 +1,6 @@
---
title: Layout
order: 5
order: 0
---
在 G6 中使用布局,在实例化图时配置 `layout` 属性。例如:

View File

@ -0,0 +1,276 @@
---
title: TreeGraph
order: 2
---
## CompactBox 紧凑树布局
紧凑盒树布局。这是树图的默认布局,其特点是布局时统合考虑每个树节点的包围盒,由经典的[ReingoldTilford tidy布局算法](http://emr.cs.iit.edu/~reingold/tidier-drawings.pdf)演进而来,适合于脑图等应用场景。
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*z-ESRoHTpvIAAAAAAAAAAABkARQnAQ' width=850 />
### 属性
#### direction
**类型**String<br />**可选值**'LR' | 'RL' | 'TB' | 'BT' | 'H' | 'V'<br />**默认值**'LR'<br />**是否必须**false<br />**说明**:树布局的方向,默认为,其他选项说明
- TB —— 根节点在上,往下布局
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*KrAqTrFbNjMAAAAAAAAAAABkARQnAQ' width=150 />
- BT —— 根节点在下,往上布局
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*vNmOTJ4q0uwAAAAAAAAAAABkARQnAQ' width=150 />
- LR —— 根节点在左,往右布局
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*ffD6S74MXw4AAAAAAAAAAABkARQnAQ' width=150 />
- RL —— 根节点在右,往左布局
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*vTg2SJbtj_sAAAAAAAAAAABkARQnAQ' width=60 />
- H —— 根节点在中间,水平对称布局
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*0GsIQISvieYAAAAAAAAAAABkARQnAQ' width=100 />
- V —— 根节点在中间,垂直对称布局
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*E0c8TIYRPYoAAAAAAAAAAABkARQnAQ' width=100 />
#### getWidth
**类型**Number | Function<br />**示例**
```javascript
(d) => {
// d 是一个节点
if (d.id === 'testId') return 50
return 100;
}
```
**是否必须**false<br />**说明**:每个节点的宽度
#### getHeight
**类型**Number | Function<br />**示例**
```javascript
(d) => {
// d 是一个节点
if (d.id === 'testId') return 50
return 100;
}
```
**是否必须**false<br />**说明**:每个节点的高度
#### getHGap
**类型**Number | Function<br />**示例**
```javascript
(d) => {
// d 是一个节点
if (d.id === 'testId') return 50
return 100;
}
```
**默认值**18<br />**是否必须**false<br />**说明**:每个节点的水平间隙
#### getVGap
**类型**Number | Function<br />**示例**
```javascript
(d) => {
// d 是一个节点
if (d.id === 'testId') return 50
return 100;
}
```
**默认值**18<br />**是否必须**false<br />**说明**:每个节点的垂直间隙
#### radial
**类型**Boolean<br />**默认值**false<br />**是否必须**false<br />**说明**:是否按照辐射状布局。若 `radial``true`,建议 `direction` 设置为 `'LR'``'RL'`
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*E0c8TIYRPYoAAAAAAAAAAABkARQnAQ' width=200 />
## Dendrogram 生态树布局
[生态树](https://en.wikipedia.org/wiki/Dendrogram)布局。特点是所有子节点布局在同一层级,适用于表示层次聚类。
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*zX7tSLqBvwcAAAAAAAAAAABkARQnAQ' width=400 />
### 属性
#### direction
**类型**String<br />**可选值**'LR' | 'RL' | 'TB' | 'BT' | 'H' | 'V'<br />**默认值**'LR'<br />**是否必须**false<br />**说明**:树布局的方向,默认为,其他选项说明
- TB —— 根节点在上,往下布局
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*krAnRrLTEnEAAAAAAAAAAABkARQnAQ' width=115 />
- BT —— 根节点在下,往上布局
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*0HRyS64i7QoAAAAAAAAAAABkARQnAQ' width=115 />
- LR —— 根节点在左,往右布局
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*T5KZTJdA2OUAAAAAAAAAAABkARQnAQ' width=55 />
- RL —— 根节点在右,往左布局
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*q7QJQ5RbQ5kAAAAAAAAAAABkARQnAQ' width=55 />
- H —— 根节点在中间,水平对称布局
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*tzIfRJ5CuR8AAAAAAAAAAABkARQnAQ' width=85 />
- V —— 根节点在中间,垂直对称布局
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*B9sjToOzCiAAAAAAAAAAAABkARQnAQ' width=115 />
#### nodeSep
**类型**Number<br />**默认值**0<br />**是否必须**false<br />**说明**:节点间距
#### rankSep
**类型**Number<br />**默认值**0<br />**是否必须**false<br />**说明**:层与层之间的间距
#### radial
**类型**Boolean<br />**默认值**false<br />**是否必须**false<br />**说明**:是否按照辐射状布局。若 `radial``true`,建议 `direction` 设置为 `'LR'``'RL'`
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*AhopQI5j-bcAAAAAAAAAAABkARQnAQ' width=175 />
## Indented 缩进树布局
缩进树布局。树节点的层级通过水平方向的缩进量来表示,常用场景是文件目录结构。每个元素会占一行/一列。
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*NBUzRonaOYMAAAAAAAAAAABkARQnAQ' width=175 />
### 属性
#### direction
**类型**String<br />**可选值**'LR' | 'RL' | 'H'<br />**默认值**'LR'<br />**是否必须**false<br />**说明**:树布局的方向,默认为,其他选项说明
- LR —— 根节点在左,往右布局(下图左)<br />
- RL —— 根节点在右,往左布局(下图中)<br />
- H —— 根节点在中间,水平对称布局(下图右)
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*mq6YSIKrAt0AAAAAAAAAAABkARQnAQ' width=110 />
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*VGEnRbpvxlUAAAAAAAAAAABkARQnAQ' width=90 />
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*Vek6RqtUXNcAAAAAAAAAAABkARQnAQ' width=160 />
> LR。RL。H。
#### indent
**类型**Number<br />**默认值**20<br />**是否必须**false<br />**说明**:列间间距
#### getWidth
**类型**Number | Function<br />**示例**
```javascript
(d) => {
// d 是一个节点
if (d.id === 'testId') return 50
return 100;
}
```
**是否必须**false<br />**说明**:每个节点的宽度
#### getHeight
**类型**Number | Function<br />**示例**
```javascript
(d) => {
// d 是一个节点
if (d.id === 'testId') return 50
return 100;
}
```
**是否必须**false<br />**说明**:每个节点的高度
#### getSide
**类型**Function<br />**示例**
```javascript
(d) => {
// d 是一个节点
if (d.id === 'testId') return 'left'
return 'right';
}
```
**是否必须**false<br />**说明**:节点放置在根节点左侧或右侧的回调函数,仅对与根节点直接相连的节点有效,设置后将会影响被设置节点的所有子孙节点。
## Mindmap 脑图树布局
深度相同的节点将会被放置在同一层,与 compactBox 不同的是,布局不会考虑节点的大小。
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*J1l5RofvbP0AAAAAAAAAAABkARQnAQ' width=350 />
### 属性
#### direction
**类型**String<br />**可选值**'H' | 'V'<br />**默认值**'H'<br />**是否必须**false<br />**说明**:树布局的方向,默认为,其他选项说明
- Hhorizontal水平—— 根节点的子节点分成两部分横向放置在根节点左右两侧
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*J1l5RofvbP0AAAAAAAAAAABkARQnAQ' width=170 />
- Vvertical (竖直)—— 将根节点的所有孩子纵向排列
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*AD0GTaNT5cQAAAAAAAAAAABkARQnAQ' width=150 />
#### getWidth
**类型**Number | Function<br />**示例**
```javascript
(d) => {
// d 是一个节点
if (d.id === 'testId') return 50
return 100;
}
```
**是否必须**false<br />**说明**:每个节点的宽度
#### getHeight
**类型**Number | Function<br />**示例**
```javascript
(d) => {
// d 是一个节点
if (d.id === 'testId') return 50
return 100;
}
```
**是否必须**false<br />**说明**:每个节点的高度
#### getHGap
**类型**Number | Function<br />**示例**
```javascript
(d) => {
// d 是一个节点
if (d.id === 'testId') return 50
return 100;
}
```
**默认值**18<br />**是否必须**false<br />**说明**:每个节点的水平间隙
#### getVGap
**类型**Number | Function<br />**示例**
```javascript
(d) => {
// d 是一个节点
if (d.id === 'testId') return 50
return 100;
}
```
**默认值**18<br />**是否必须**false<br />**说明**:每个节点的垂直间隙
#### getSide
**类型**Function<br />**示例**
```javascript
(d) => {
// d 是一个节点
if (d.id === 'test-child-id') return 'right'
return 'left';
}
```
**默认值**'right'<br />**是否必须**false<br />**说明**:节点排布在根节点的左侧/右侧。若设置了该值,则所有节点会在根节点同一侧,即 direction = 'H' 不再起效。若该参数为回调函数,则可以指定每一个节点在根节点的左/右侧。

View File

@ -11,12 +11,14 @@ Edge继承自Item所以Item上面的方法在Edge实例中都可以使用
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| source | Node | true | 起始节点实例 |
**用法**
```javascript
const edge = new Edge(
{
@ -37,12 +39,14 @@ edge.setSource(node)
**参数**
| 名称 | 类型 | 是否必选 | 描述 |
| --- | --- | --- | --- |
| target | Node | true | 终止节点实例 |
**用法**
```javascript
const edge = new Edge(
{
@ -69,6 +73,7 @@ edge.setTarget(node)
**用法**
```javascript
const edge = new Edge(
{
@ -91,6 +96,7 @@ const node = edge.getSource()
**用法**
```javascript
const edge = new Edge(
{

View File

@ -67,4 +67,5 @@ graph.update(node, {
通过以上代码修改node中文本的样式效果如下图
![image.png](https://cdn.nlark.com/yuque/0/2019/png/244306/1567404022599-698a424a-5c1d-4218-84e7-61b27ba0c33f.png#align=left&display=inline&height=391&name=image.png&originHeight=782&originWidth=778&search=&size=118744&status=done&width=389)
<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*euH9SLcS2IoAAAAAAAAAAABkARQnAQ' width=350>

View File

@ -125,6 +125,14 @@ module.exports = {
},
order: 4
},
{
slug: 'api/layout',
title: {
zh: 'Layout',
en: 'Layout'
},
order: 4
},
{
slug: 'api/properties',
title: {