g6/packages/site/docs/manual/tutorial/example.zh.md

174 lines
8.4 KiB
Markdown
Raw Normal View History

2023-02-02 10:31:36 +08:00
---
title: 绘制 Tutorial 案例
order: 1
---
本文将进行 **Tutorial 案例**的简单绘制和配置。通过本文,你将知道创建一般图时一些常用的配置项及其作用。
## 基础绘制
### 创建容器
需要在 HTML 中创建一个用于容纳 G6 绘制的图的容器,通常为 `div`  标签。G6 在绘制时会在该容器下追加 `canvas` 标签,然后将图绘制在其中。
```html
<body>
2023-08-31 18:16:13 +08:00
<div id="container"></div>
2023-02-02 10:31:36 +08:00
<!-- 引入 G6 -->
<!-- ... -->
</body>
```
### 数据准备
2023-08-31 18:16:13 +08:00
引入 G6 的数据源为 JSON 格式的对象。v5 的数据格式与 v4 有所不同,详见[如何升级-数据格式变更](https://g6-next.antv.antgroup.com/manual/upgrade#1%EF%B8%8F%E2%83%A3-%E6%95%B0%E6%8D%AE%E6%A0%BC%E5%BC%8F%E5%8F%98%E6%9B%B4)。v5 也提供了 v4 数据的转换处理器,在下面图配置中将进行讲解。
2023-02-02 10:31:36 +08:00
2023-08-31 18:16:13 +08:00
数据中需要有节点(`nodes`)和边(`edges`)字段,分别用数组表示:
```javascript
const data = {
// 点集
nodes: [
{
id: 'node1', // string | number, 该节点存在则必须,节点的唯一标识
data: {
// 存放一些业务属性,或特殊的节点配置
name: 'Circle1',
2023-02-02 10:31:36 +08:00
},
2023-08-31 18:16:13 +08:00
},
{
id: 'node2', // string | number, 该节点存在则必须,节点的唯一标识
data: {
// 存放一些业务属性,或特殊的节点配置
name: 'Circle2',
2023-02-02 10:31:36 +08:00
},
2023-08-31 18:16:13 +08:00
},
],
// 边集
edges: [
{
id: 'edge1',
source: 'node1', // string | number, 必须,起始点 id
target: 'node2', // string | number, 必须,目标点 id
data: {}, // 存放一些业务属性,或特殊的边配置
},
],
};
2023-02-02 10:31:36 +08:00
```
<span style="background-color: rgb(251, 233, 231); color: rgb(139, 53, 56)"><strong>⚠️ 注意:</strong></span>
2023-08-31 18:16:13 +08:00
- `nodes` 数组中包含节点对象。每个节点对象中唯一的、必要的 `id` 以标识不同的节点,`x`、 `y` 指定该节点的位置;
- `edges` 数组中包含边对象。`source` 和 `target` 是每条边的必要属性,分别代表了该边的起始点 `id` 与 目标点 `id`
2023-02-02 10:31:36 +08:00
### 图实例化
2023-08-31 18:16:13 +08:00
图实例化时,至少需要为图设置容器。若您使用的是 G6 v4 的图数据格式,可以在实例化图时配置 `transforms: ['transform-v4-data']``'transform-v4-data'` 是 G6 v5 的内置数据转换器G6 将在读取数据后,将 v4 数据格式化 v5 要求的格式
2023-02-02 10:31:36 +08:00
2023-08-31 18:16:13 +08:00
```javascript
// const data = { ... }
const graph = new G6.Graph({
container: 'constainer', // String | HTMLElement必须在 Step 1 中创建的容器 id 或容器本身
width: 800, // number图的宽度不指定则使用容器宽度
height: 500, // number图的高度不指定则使用容器高度
// transforms: ['transform-v4-data'] //
});
2023-02-02 10:31:36 +08:00
```
### 图的渲染
2023-08-31 18:16:13 +08:00
```javascript
// const initData = { ... }
// const graph = ...
graph.read(data); // 加载数据
2023-02-02 10:31:36 +08:00
```
### 绘制结果
2023-08-31 18:16:13 +08:00
调用 `graph.read(data)` 方法之后G6 会根据加载的数据进行图的绘制。结果如下:
2023-02-02 10:31:36 +08:00
2023-08-31 18:16:13 +08:00
<img src='https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*1ejjTYxD94QAAAAAAAAAAAAADmJ7AQ/original' width=400 alt='img' />
2023-02-02 10:31:36 +08:00
## 真实数据加载
2023-09-01 00:13:08 +08:00
上文中,我们使用了仅含有两个节点和一条边的数据,直接将数据定义放在了代码中。而真实场景的数据通常是远程接口请求加载的。为了方便,我们已经给读者准备好了一份 JSON 数据文件,地址如下:<br />`https://raw.githubusercontent.com/antvis/G6/v5/packages/g6/tests/datasets/force-data.json`
2023-02-02 10:31:36 +08:00
### 加载远程数据
修改 index.html通过 `fetch` 函数异步加载远程的数据源,并传入 G6 的图实例中:
2023-08-31 18:16:13 +08:00
```javascript
2023-02-02 10:31:36 +08:00
<script>
// const graph = ...
const main = async () => {
const response = await fetch(
2023-09-01 00:13:08 +08:00
'https://raw.githubusercontent.com/antvis/G6/v5/packages/g6/tests/datasets/force-data.json',
2023-02-02 10:31:36 +08:00
);
const remoteData = await response.json();
// ...
2023-08-31 18:16:13 +08:00
graph.read(remoteData); // 加载远程数据
2023-02-02 10:31:36 +08:00
};
main();
</script>
```
> `fetch` 函数允许我们发起网络请求,加载数据,而其异步的过程可以通过 async/await 进行更合理的控制。这里我们为了方便起见,将主要逻辑放在了 `main` 函数里面。如果读者对 `fetch` 和 `async`/`await` 的知识有疑问,可以参考:<a href='https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function' target='_blank'>async function</a><a href='https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API' target='_blank'>Fetch API</a>
运行后,我们得到了下图结果:
2023-08-31 18:16:13 +08:00
<img src='https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*WmGnQKAbmtsAAAAAAAAAAAAADmJ7AQ/original' width=550 alt='img' />
2023-02-02 10:31:36 +08:00
2023-08-31 18:16:13 +08:00
乍看之下,图像有点奇怪,实际上数据已经正确的加载了进来。由于数据量比较大,节点和边都非常的多,默认使用了网格布局看不出节点的连接关系。接下来,我们将使用更多图的配置项使数据更清晰好看。
2023-02-02 10:31:36 +08:00
## 常用配置
本文使用到的配置以及后续 Tutorial 将会使用到到常用配置如下:
2023-08-31 18:16:13 +08:00
| 配置项 | 类型 | 选项 / 示例 | 默认 | 说明 |
| ---------- | ----------------- | -------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------------------ |
| transforms | Array | ['transform-v4-data', { type: 'map-node-size', field: 'value' }] | null | 数据处理器。在原始用户数据进入 Graph 后将依次执行 transform 中的处理器,得到处理后的数据。 |
| modes | Object | {<br />  default: [ 'drag-node', 'drag-canvas' ]<br />} | null | 图上行为模式的集合。 |
| node | Object / Function | {<br />  type: 'circle',<br />  keyShape: {<br />    ......<br />  }<br />} | null | 节点全局的属性映射器包括一般属性和样式属性style。v5 支持了函数映射。 |
| edge | Object / Function | {<br />  type: 'polyline',<br />  keyShape: {<br />    ......<br />  }<br />} | null | 边全局的属性映射器包括一般属性和样式属性style。v5 支持了函数映射。 |
| nodeState | Object | {<br />  hover: {<br />    ......<br />  },<br />  select: {<br />    ......<br />  }<br />} | null | 节点在除默认状态外其他状态下的样式属性style。例如鼠标放置hover、选中select等状态。 |
| edgeState | Object | {<br />  hover: {<br />    ......<br />  },<br />  select: {<br />    ......<br />  }<br />} | null | 边在除默认状态外其他状态下的样式属性style。例如鼠标放置hover、选中select等状态。 |
| plugins | Array | ['minimap', { type: 'tooltip', itemTypes: ['node'] }] | null | 插件 |
2023-02-02 10:31:36 +08:00
## 完整代码
至此,完整代码如下:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Tutorial Demo</title>
</head>
<body>
2023-08-31 18:16:13 +08:00
<div id="container"></div>
<script src="https://gw.alipayobjects.com/os/lib/antv/g6/5.0.0-beta.21/dist/g6.min.js"></script>
2023-02-02 10:31:36 +08:00
<script>
const graph = new G6.Graph({
2023-08-31 18:16:13 +08:00
container: 'container',
2023-02-02 10:31:36 +08:00
width: 1000,
height: 600,
});
const main = async () => {
const response = await fetch(
2023-09-01 00:13:08 +08:00
'https://raw.githubusercontent.com/antvis/G6/v5/packages/g6/tests/datasets/force-data.json',
2023-02-02 10:31:36 +08:00
);
const remoteData = await response.json();
2023-08-31 18:16:13 +08:00
graph.read(remoteData);
2023-02-02 10:31:36 +08:00
};
main();
</script>
</body>
</html>
```
2023-09-01 00:13:08 +08:00
<span style="background-color: rgb(251, 233, 231); color: rgb(139, 53, 56)"><strong>⚠️ 注意:</strong></span><br />若需更换数据,请替换  `'https://raw.githubusercontent.com/antvis/G6/v5/packages/g6/tests/datasets/force-data.json'`  为新的数据文件地址。