@antv/g6从0到1

3 阅读4分钟

《@antv/g6 从0到1》是一份系统性学习 AntV G6 图可视化引擎的入门指南。G6 是蚂蚁集团 AntV 团队推出的专业级图分析与图可视化引擎,适用于关系数据(如社交网络、知识图谱、流程图、拓扑图等)的可视化展示和交互分析。

下面是一个从零开始掌握 @antv/g6 的完整路径指南:


🚀 一、什么是 G6?

G6 是一个基于 Web 的 图可视化引擎,由 AntV 团队开发,支持:

  • 节点(Node)、边(Edge)、组合(Combo)的绘制
  • 多种内置布局(如力导引、环形、树状等)
  • 强大的交互能力(拖拽、缩放、高亮、筛选等)
  • 高度可扩展的自定义节点/边/行为
  • 支持大规模图渲染(WebGL 渲染模式)

官网:g6.antv.antgroup.com
GitHub:github.com/antvis/G6


🧱 二、环境准备

1. 创建项目(以 React 为例)

npx create-react-app g6-demo
cd g6-demo
npm install @antv/g6

2. 引入 G6

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

📈 三、第一个 G6 图表(Hello World)

示例代码:绘制一个简单的关系图

import React, { useEffect } from 'react';
import { Graph } from '@antv/g6';

const MyGraph = () => {
  useEffect(() => {
    const data = {
      nodes: [
        { id: 'node1', x: 100, y: 200 },
        { id: 'node2', x: 300, y: 200 },
      ],
      edges: [
        { source: 'node1', target: 'node2' }
      ]
    };

    const graph = new Graph({
      container: 'container', // 指定DOM容器ID
      width: 800,
      height: 600,
      modes: {
        default: ['drag-canvas', 'zoom-canvas'], // 允许拖拽画布、缩放
      },
      layout: {
        type: 'radial', // 径向布局
      }
    });

    graph.data(data); // 加载数据
    graph.render();   // 渲染图表

    return () => {
      if (graph) {
        graph.destroy();
      }
    };
  }, []);

  return <div id="container" style={{ border: '1px solid #ccc' }}></div>;
};

export default MyGraph;

🧩 四、核心概念解析

概念说明
Node(节点)表示图中的实体,如人、设备、页面等
Edge(边)表示两个节点之间的关系
Combo(组合)用于将多个节点分组,类似文件夹
Graph(图实例)核心类,负责渲染和交互
Layout(布局)控制节点排列方式,如 force、dagre、circular 等
Mode(模式)定义用户交互行为集合,如拖拽、选择、创建边等
Behavior(行为)可编程的交互逻辑,如点击高亮邻居

🎨 五、美化图表

1. 自定义节点样式

graph.node((node) => {
  return {
    type: 'circle', // 使用圆形节点
    style: {
      fill: '#5B8FF9',
      stroke: '#3E5DDB',
      lineWidth: 2,
    },
  };
});

2. 自定义边样式

graph.edge((edge) => {
  return {
    style: {
      stroke: '#F6BD16',
      endArrow: true,
    },
  };
});

🔁 六、使用布局自动排布

无需手动设置 x, y,让布局算法自动计算位置。

layout: {
  type: 'force', // 力导向布局
  preventOverlap: true,
  linkDistance: 100,
  nodeStrength: -300,
  edgeStrength: 0.5,
},

常见布局类型:

  • force:力导向(适合无向图)
  • dagre:层次布局(适合流程图、组织结构)
  • circular:环形布局
  • radial:径向布局
  • grid:网格布局

🖱️ 七、添加交互行为

示例:点击节点高亮其邻居

graph.on('node:click', (evt) => {
  const { item } = evt;
  const model = item.getModel();

  // 清除之前高亮
  graph.getNodes().forEach((node) => {
    graph.setItemState(node, 'highlight', false);
  });

  // 高亮当前节点及其邻居
  const neighbors = graph.getNeighbors(item);
  graph.setItemState(item, 'highlight', true);
  neighbors.forEach((neighbor) => {
    graph.setItemState(neighbor, 'highlight', true);
  });
});

// 在 node 中根据状态设置样式
graph.node((node) => {
  const isHighlight = node.highlight;
  return {
    style: {
      fill: isHighlight ? '#FF6B6B' : '#5B8FF9',
      stroke: isHighlight ? '#FF4757' : '#3E5DDB',
    },
  };
});

✅ 八、常用 Behavior 内置功能

modes 中配置:

modes: {
  default: [
    'drag-canvas',     // 拖动画布
    'zoom-canvas',     // 缩放画布
    'drag-node',       // 拖动节点
    'select-node',     // 选择节点
    'collapse-expand-combo' // 折叠组合
  ],
},

你也可以注册自定义 Behavior:

G6.registerBehavior('custom-behavior', {
  getEvents() {
    return {
      'node:dblclick': 'onDblClick',
    };
  },
  onDblClick(evt) {
    console.log('双击了节点:', evt.item.getModel());
  }
});

📦 九、高级功能概览

功能说明
自定义节点/边使用 registerNode / registerEdge 绘制复杂图形(如带图标、文本、图片)
Combo 分组实现嵌套结构,支持折叠展开
大规模图优化启用 webgl 渲染模式提升性能
导出图片graph.downloadImage() 导出 PNG/SVG
数据更新使用 graph.changeData(newData) 动态刷新
插件扩展如 minimap(小地图)、grid(背景网格)、toolbar 等

📘 十、学习资源推荐

  1. 官方文档(中文)
    👉 g6.antv.antgroup.com
  2. 官方示例库(必看)
    👉 g6.antv.antgroup.com/examples
  3. GitHub 仓库 & Issues
    👉 github.com/antvis/G6
  4. 社区交流
    • 钉钉群:搜索 “AntV” 进入官方技术支持群
    • GitHub Discussions 提问

🏁 十一、总结:从0到1路线图

阶段目标
第1天创建项目,跑通第一个 G6 示例
第2天学会使用不同布局(force/dagre/circular)
第3天掌握基本交互(点击、高亮、拖拽)
第4天自定义节点/边样式
第5天使用 Combo 分组 + 折叠功能
第6天添加 minimap、grid 插件
第7天实现一个真实场景案例(如知识图谱、流程图)

💡 实战建议

  • 数据格式统一为 { nodes: [], edges: [], combos?: [] }
  • 使用 TypeScript 可获得更好的类型提示
  • 对于大数据量(>1000 节点),启用 webgl 渲染或开启 incremental 增量渲染
  • 尽量使用 graph.changeData() 而非重新实例化 Graph

如果你告诉我你想实现的具体图表类型(比如:流程图、组织架构图、社交网络图),我可以为你定制一份详细的代码模板和实现步骤!

是否需要我提供一个 React + TypeScript + G6 的完整模板项目结构?欢迎继续提问!