logo

G6

  • 文档
  • API
  • 图表示例
  • 社区
  • 所有产品antv logo arrow
  • 5.0.47
  • 简介
  • 开始使用
    • 快速开始
    • 安装
    • 前端框架集成
      • 在 React 中使用
      • 在 Vue 中使用
      • 在 Angular 中使用
    • 详细教程
  • 图 Graph
    • Graph - 图
    • Options 配置项
    • 内置扩展
    • Extension - 扩展
  • 数据 Data
  • 元素 Element
    • 元素总览
    • 元素状态
    • 节点 Node
      • 节点总览
      • 内置节点
        • 节点通用配置项
        • Diamond 菱形
        • Donut 甜甜圈
        • Ellipse 椭圆形
        • Hexagon 六边形
        • Html HTML
        • Image 图片
        • Rect 矩形
        • Star 五角形
        • Triangle 三角形
        • Circle 圆形
      • 自定义节点
      • 使用 React 定义节点
    • 边 Edge
      • 边总览
      • 内置边
        • 边通用配置项
        • Cubic 三次贝塞尔曲线
        • CubicHorizontal 水平三次贝塞尔曲线
        • CubicVertical 垂直三次贝塞尔曲线
        • Line 直线
        • Polyline 折线
        • Quadratic 二次贝塞尔曲线
      • 自定义边
    • 组合 Combo
      • 组合总览
      • 内置组合
        • 组合配置项
        • Circle 圆形
        • Rect 矩形
      • 自定义 Combo
    • 图形 Shape
      • 图形 Shape 与 KeyShape
      • 原子 Shape 以及其属性
      • 复合 Shape 的设计与实现
  • 布局 Layout
    • 布局总览
    • 内置布局
      • 布局通用配置项
      • AntvDagre 布局
      • Circular 环形布局
      • ComboCombined 复合布局
      • CompactBox 紧凑树
      • Concentric 同心圆布局
      • D3Force 力导向布局
      • D3Force3D 3D 力导向布局
      • Dagre 布局
      • Dendrogram 生态树
      • Fishbone 鱼骨布局
      • Force 力导向布局
      • ForceAtlas2 力导向布局
      • Fruchterman 力导向布局
      • Grid 网格布局
      • Indented 缩进树
      • MDS 高维数据降维布局
      • Mindmap 脑图树
      • Radial 径向布局
      • Random 随机布局
      • Snake 蛇形布局
    • 自定义布局
  • 交互 Behavior
    • 交互总览
    • 内置交互
      • AutoAdaptLabel 标签自适应显示
      • BrushSelect 框选
      • ClickSelect 点击选中
      • CollapseExpand 展开/收起元素
      • CreateEdge 创建边
      • DragCanvas 拖拽画布
      • DragElement 拖拽元素
      • DragElementForce 力导向拖拽元素
      • FixElementSize 缩放画布时固定元素大小
      • FocusElement 聚焦元素
      • HoverActivate 悬停激活
      • LassoSelect 套索选择
      • OptimizeViewportTransform 优化视口变换
      • ScrollCanvas 滚动画布
      • ZoomCanvas 缩放画布
    • 自定义交互
  • 插件 Plugin
    • 插件总览
    • 内置插件
      • Background 背景
      • BubbleSets 气泡集
      • Contextmenu 上下文菜单
      • EdgeBundling 边绑定
      • EdgeFilterLens 边过滤镜
      • Fisheye 鱼眼放大镜
      • Fullscreen 全屏展示
      • GridLine 网格线
      • History 历史记录
      • Hull 轮廓包围
      • Legend 图例
      • Minimap 小地图
      • Snapline 对齐线
      • Timebar 时间条
      • Toolbar 工具栏
      • Tooltip 提示框
      • Watermark 水印
    • 自定义插件
  • 数据处理 Transform
    • 数据处理总览
    • 内置数据处理
      • MapNodeSize 动态调整节点大小
      • PlaceRadialLabels 径向标签
      • ProcessParallelEdges 平行边
    • 自定义数据处理
  • 主题 Theme
    • 主题总览
    • 自定义主题
    • 色板
    • 自定义色板
  • 动画 Animation
    • 动画总览
    • 自定义动画
  • 扩展阅读
    • 事件
    • 渲染器
    • 坐标系
    • 下载图片
    • 使用 iconfont
    • 使用 3D
    • 项目打包
  • 版本特性
    • 新版本特性
    • 升级到 5.0
  • 常见问题
  • 参与贡献

常见问题

上一篇
升级到 5.0
下一篇
参与贡献

Resources

Ant Design
Galacea Effects
Umi-React 应用开发框架
Dumi-组件/文档研发工具
ahooks-React Hooks 库

社区

体验科技专栏
seeconfSEE Conf-蚂蚁体验科技大会

帮助

GitHub
StackOverflow

more products更多产品

Ant DesignAnt Design-企业级 UI 设计语言
yuque语雀-知识创作与分享工具
EggEgg-企业级 Node 开发框架
kitchenKitchen-Sketch 工具集
GalaceanGalacean-互动图形解决方案
xtech蚂蚁体验科技
© Copyright 2025 Ant Group Co., Ltd..备案号:京ICP备15032932号-38

Loading...

Extension 和 Plugin 有什么区别?

Extension 是 G6 中的一个概念,是所有可注册内容的统称,包含元素、交互、布局、插件等。

Plugin 是 G6 提供的灵活扩展机制,是一种特殊的 Extension。

设置文本超出省略

以 label 为例,设置 labelWordWrap 和 labelWordWrapWidth 即可实现文本超出省略。

{
labelText: 'This is a long text',
labelWordWrap: true,
labelWordWrapWidth: 50,
}

按键不生效

一些插件或交互支持配置触发按键,请使用标准按键名:如 Control, Shift, Alt, Meta,以及字母、数字、符号等。

更新数据后画布不更新

请确保数据更新后调用 graph.draw() 或者 graph.render() 更新画布。

G6 对于多次数据更新,会在 draw 或 render 后合并差异并统一更新画布,以提高性能。

交互有冲突如何解决

当多个交互之间存在冲突时,你可以设置交互的启用时机来避免多个交互被同时触发。

以 drag-canvas 和 brush-select 为例,如果直接配置这两个交互,当指针在画布上进行拖拽时,会导致交互异常。可以设置为在按下 shift 键时禁用 drag-canvas 交互。

behaviors: [
{
type: 'drag-canvas',
enable: (event) => event.shiftKey === false,
},
{
type: 'brush-select',
},
];

此时,当按下 shift 键时,drag-canvas 交互会被禁用,brush-select 交互会不会受到影响。

draw 和 render 的区别

draw 和 render 都会执行绘制操作,但 render 会在 draw 的基础上额外进行布局、视图自适应操作。

可以简单理解为:render = draw + layout + fitView/fitCenter。

数据中的样式不生效

原因一:被样式映射中的样式覆盖

{
data: [{ id: 'node-1', style: { fill: 'orange' } }],
node: {
style: {
fill: 'pink', // 无论数据中的样式如何,都会被这里的样式覆盖
}
}
}

解决方式:使用回调方法,优先从数据中获取样式以提高数据优先级

{
node: {
style: (data) => {
return {
fill: data.style?.fill || 'pink',
};
};
}
}

画布中出现残影

在使用 Canvas 渲染器进行绘制时,可能会出现残影现象,这些图形被称为“脏矩形”。该现象出现的原因是底层渲染引擎为了提高性能,每次绘制时只会绘制发生变化的部分,而不会清空整个画布。

但是,当画布中的图形发生变化时,可能会出现部分图形未被正确清除的情况,从而导致残影现象。

可以通过以下方式解决:

  1. 使用 SVG 或 WebGL 渲染器;
  2. 检查节点中的图形样式中是否存在非法值,例如 null、NaN 等;
  3. 尽量使用整数作为数值型的样式值,例如 r、width、height、fontSize 等;

使用原生 JavaScript 对象数据

请避免使用 Vue 响应式数据、Immer.js 等包装过的对象作为 G6 的数据源,因为这些对象会在内部进行深度监听,甚至冻结数据对象,导致 G6 无法正常操作数据。

G6 项目启动在编译时警告类型映射指向不存在路径

WARNING in ./node_modules/@antv/util/esm/path/util/segment-cubic-factory.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Users/xxx/workspace/antv-g6-learn/node_modules/@antv/util/esm/path/util/src/path/util/segment-cubic-factory.ts' file: Error: ENOENT: no such file or directory, open '/Users/xxx/workspace/antv-g6-learn/node_modules/@antv/util/esm/path/util/src/path/util/segment-cubic-factory.ts'
WARNING in ./node_modules/@antv/util/esm/path/util/segment-line-factory.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Users/xxx/workspace/antv-g6-learn/node_modules/@antv/util/esm/path/util/src/path/util/segment-line-factory.ts' file: Error: ENOENT: no such file or directory, open '/Users/xxx/workspace/antv-g6-learn/node_modules/@antv/util/esm/path/util/src/path/util/segment-line-factory.ts'
WARNING in ./node_modules/@antv/util/esm/path/util/segment-quad-factory.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Users/xxx/workspace/antv-g6-learn/node_modules/@antv/util/esm/path/util/src/path/util/segment-quad-factory.ts' file: Error: ENOENT: no such file or directory, open '/Users/xxx/workspace/antv-g6-learn/node_modules/@antv/util/esm/path/util/src/path/util/segment-quad-factory.ts'

解释: @antv/util 是 AntV 底层依赖的工具库。

从上面部分警告信息中我们可以得知是 G6 依赖的 @antv/util 工具库的类型声明文件存在问题,该警告不影响项目正常运行。

该信息只会在 TypeScript 项目中出现,关闭办法如下:

  1. 关闭TypeScript 的sourcemap源码映射

在项目根目录下创建.env文件,并添加以下内容:

GENERATE_SOURCEMAP=false
  1. 单独禁用指定模块的源码映射

直接禁用sourcemap映射的方式过于简单粗暴,对于部分可能有调试需求的开发者不太友好,所以也可以通过在构建工具单独配置,单独禁用这些特定模块的源码映射。

a. webpack配置

module.exports = {
// ...其他配置
module: {
rules: [
{
test: /node_modules\/@antv\/util\/esm\/path\/util\/.+\.js$/,
use: ['source-map-loader'],
enforce: 'pre',
},
],
},
ignoreWarnings: [/Failed to parse source map/],
};

b. vite配置

import { defineConfig } from 'vite';
export default defineConfig({
build: {
rollupOptions: {
onwarn(warning, warn) {
// 忽略特定模块的警告
if (warning.code === 'MODULE_LEVEL_DIRECTIVE' && warning.message.includes('@antv/util')) {
return;
}
// 对于其他警告,使用默认的警告处理
warn(warning);
},
},
},
});

手动配置色板颜色不生效

在 v5 中内置颜色有:export type BuiltInPalette = 'spectral' | 'oranges' | 'greens' | 'blues';

解决办法如下:

const graph = new Graph({
container: '#ID',
width: number,
height: number,
data,
node: {
palette: {
field: 'color',
// right
color: ['red', 'green', 'blue'],
// error
// color: 'red'
},
},
});

grid-line 插件不生效

在 v5 中内置插件有bubble-sets edge-filter-lens grid-line background contextmenu fisheye fullscreen history hull legend minimap snapline timebar toolbar tooltip >watermark. 具体参考

实际原因: graph实例的父容器<div ref={containerRef} />本身没有设置高度,G6 Graph图 可能无法正确计算出合适的大小。如果要启用grid-line画布插件,需要给父元素 div 设置宽高,在 graph 配置中是无效的。

v5无法使用树图布局

统一使用new Graph({xxx})。

在 v5 中内置布局有antv-dagre combo-combined compact-box force-atlas2 circular concentric d3-force dagre dendrogram force fruchterman grid indented mds mindmap radial random. 具体参考

v5合并了图和树图,不再通过实例化G6.TreeGraph创建树图布局,并且移除该方式。具体参考特性-合并图与树图

edge 没有连接在 node 的边缘中心

配置portLinkToCenter为 true。

const graph = new Graph({
container: xxx,
node: {
type: 'rect',
style: {
portLinkToCenter: true,
},
},
edge: {
type: 'xxx',
},
});

如何根据label内容长度动态设置node宽度

参考方案:#6347

const measureTextWidth = memoize(
(text: string, font: any = {}): TextMetrics => {
const { fontSize, fontFamily = 'sans-serif', fontWeight, fontStyle, fontVariant } = font;
const ctx = getCanvasContext();
// @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/font
ctx.font = [fontStyle, fontWeight, fontVariant, `${fontSize}px`, fontFamily].join(' ');
return ctx.measureText(isString(text) ? text : '').width;
},
(text: string, font = {}) => [text, ...values(font)].join(''),
);
const graph = new G6.Graph({
node: {
style: { size: d => [measureTextWidth(d.label, {...}) , xxx] },
}
})

NodeEvent节点事件对象类型不齐全问题

可以手动指定IPointerEvent类型。具体参考#6346

import { NodeEvent } from '@antv/g6';
import type { IPointerEvent } from '@antv/g6';
graph.on(NodeEvent.CLICK, (event: IPointerEvent) => {
// handler
});

解除节点所在组合

更新节点数据,combo 值设置为 null。

graph.updateNodeData([{ id: 'node-id', combo: null }]);