G6 布局通用配置完全指南:BaseLayout 公共参数与内置布局体系解析
数据可视化前端图表库【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址https://gitcode.com/gh_mirrors/g6/G6点击查看免费下载本文围绕 G6antv/g6中所有内置布局共同支持的通用配置项展开系统讲解type、preLayout、nodeFilter、iterations、animation、width/height/center、node/edge字段映射等公共属性的作用、默认值与底层运行机制并深入布局运行时LayoutController与内置布局注册表帮助你写出可预测、可复用的布局配置。读完本文你将能够熟练配置任意内置布局理解前布局pre-layout与后布局post-layout的执行差异并掌握迭代布局force 系列的驱动方式。通用配置总览在 G6 中无论你使用哪一种内置布局layout配置对象都共享一组通用属性。这些属性由布局基类BaseLayout与其选项类型BaseLayoutOptions统一约束见 packages/g6/src/layouts/types.ts其中type是唯一必填项其余均为可选项。PropertyDescriptionTypeDefaultRequiredtype布局类型内置或自定义布局的名称Type-✓isLayoutInvisibleNodes不可见节点是否参与布局在 preLayout 为 true 时生效booleanfalsenodeFilter参与布局的节点(node: NodeData) boolean() truecomboFilter参与布局的 combo 元素(combo: ComboData) boolean() truepreLayout使用前布局在初始化元素前计算布局booleanfalseenableWorker是否在 WebWorker 中运行布局boolean-iterations迭代布局的迭代次数number-animation是否启用布局动画booleanfalsewidth布局区域宽度默认为当前容器宽度number-height布局区域高度默认为当前容器高度number-center布局中心点[number, number] | [number, number, number]-node节点字段映射用于将业务字段映射为布局字段(datum) ({ id?, x?, y?, z?, parentId?, isCombo? })-edge边字段映射用于将业务字段映射为布局字段(datum) ({ id?, source?, target? })-补充说明原文要点结合源码进一步展开width/height/center是由antv/layout统一支持的通用布局字段。在 G6 运行时中这些值并非直接取自你的配置当未显式配置时LayoutController.initGraphLayout会读取视口viewport的画布尺寸viewport.getCanvasSize()并以[width / 2, height / 2]作为默认中心点注入布局实例见 packages/g6/src/runtime/layout.ts。对于d3-force/d3-force-3d中心点还会被特殊处理为{ x, y, z: 0 }的对象形式。node/edge用于适配非标准业务字段如自定义的id/source/target字段名。在 G6 中即使不写这两个字段布局适配层也会注入一套默认映射node默认将节点样式中的x/y/z、所属 comboparentId与isCombo标记映射为布局字段edge默认映射id/source/target见 packages/g6/src/utils/layout.ts。iterations是 G6 运行时用于驱动迭代布局的步数与某些布局内部自身的算法参数不是同一个概念。在 graphLayout 实现中未配置时默认取300开启动画时以maxIteration: iterations逐帧回调onTick更新位置关闭动画时直接执行并layout.stop()后调用layout.tick(iterations)一次性拿到终态位置。Type布局类型的指定方式type指定布局类型值为内置布局类型的名称或自定义布局的名称。它直接决定了运行时从扩展注册表中取出哪个布局类const graph new Graph({ // Other configurations... layout: { type: antv-dagre, }, });在 packages/g6/src/registry/build-in.ts 中内置布局统一注册在layout分类下当前仓库内置的布局类型包括antv-dagre基于 dagre 的自定义布局 → AntvDagreLayout.en.mdcircular环形布局 → CircularLayout.en.mdcombo-combined适合组合combo场景的布局 → ComboCombinedLayout.en.mdconcentric同心圆布局 → ConcentricLayout.en.mdd3-force基于 D3 的力导向布局 → D3ForceLayout.en.mdd3-force-3d3D 力导向布局 → D3Force3DLayout.en.mddagreDagre 布局 → DagreLayout.en.mdfishbone鱼骨图布局 → Fishbone.en.mdforce力导向布局 → ForceLayout.en.mdforce-atlas2ForceAtlas2 布局 → ForceAtlas2Layout.en.mdfruchtermanFruchterman 布局 → FruchtermanLayout.en.mdgrid网格布局 → GridLayout.en.mdmds适用于高维数据的 MDS 布局 → MdsLayout.en.mdradial辐射布局 → RadialLayout.en.mdrandom随机布局 → RandomLayout.en.mdsnake蛇形布局 → Snake.en.mdcompact-box紧凑盒树布局 → CompactBoxLayout.en.mddendrogram树状图布局 → DendrogramLayout.en.mdmindmap思维导图布局 → MindmapLayout.en.mdindented缩进树布局 → IndentedLayout.en.md从源码结构看这些内置布局大致分为三类直接继承 G6BaseLayout的布局例如fishbonefishbone.ts与snakesnake.ts它们是 G6 原生实现的布局来自antv/layout的图布局如force、d3-force、circular、grid、radial、antv-dagre、dagre等运行时通过 layoutAdapter / legacyLayoutAdapter 统一适配为 G6 的BaseLayout接口来自antv/hierarchy的树布局如compact-box、dendrogram、mindmap、indented由 isTreeLayout 识别后走treeLayout执行路径见 packages/g6/src/runtime/layout.ts。若type传入未注册的名称initGraphLayout会调用print.warn输出 “The layout of ${type} is not registered.” 警告见 packages/g6/src/runtime/layout.ts。参与布局的元素筛选nodeFilter / comboFilternodeFilter与comboFilter决定哪些节点 / combo 参与布局默认均返回true全部参与。在 getLayoutData 中筛选逻辑与preLayout取值相关preLayout 为 true 时直接从数据模型model.getData()中取节点先判断style.visibility hidden的不可见节点是否排除受isLayoutInvisibleNodes控制再检查该节点的树/组合祖先中是否存在折叠collapsed节点最后应用你的nodeFilterpreLayout 为 false 时以「元素是否已渲染」为前提先通过element.getElementById判断节点元素是否存在且未被销毁isToBeDestroyed再应用你的nodeFilter。边则会进一步被裁剪只有当边的source与target都落在「参与布局的节点 combo」集合内时该边才会进入布局见 packages/g6/src/runtime/layout.ts。组合combo本身作为「类节点」与节点合并进同一个nodeLikeIdsMap从而让布局可以感知 combo 的层级关系。典型用法只让部分节点参与布局其余节点保持原位。const graph new Graph({ // Other configurations... layout: { type: force, nodeFilter: (node) node.data.layout ! fixed, // 业务字段筛选 }, });前布局与不可见节点preLayout / isLayoutInvisibleNodespreLayout默认false表示是否使用前布局——即在初始化元素之前先计算布局。适合一些需要提前确定节点位置的场景如首帧就要呈现完整布局的树图、需要精确缩放适配的场景。在运行时中preLayout由 isPreLayout 判定要求布局配置为非数组且preLayout: true并在首次绘制前通过LayoutController.preLayout执行之后的数据更新不会再触发见 packages/g6/src/runtime/layout.ts。执行过程中会依次派发BEFORE_LAYOUT/AFTER_LAYOUT生命周期事件并将模拟布局结果同步回数据模型model.syncNodeLikeDatum/model.syncEdgeDatum。isLayoutInvisibleNodes默认false仅在preLayout为 true 时生效置为true后隐藏节点style.visibility hidden以及位于折叠子树/折叠 combo 下的节点也会参与布局计算见 packages/g6/src/runtime/layout.ts。迭代驱动iterationsiterations用于控制迭代类布局force 系的迭代步数。G6 运行时通过antv/layout导出的isLayoutWithIterations判断当前布局是否可迭代并分两条路径处理见 packages/g6/src/runtime/layout.ts开启animationlayout.execute(data, { animate: true, maxIteration: iterations, onTick })每次迭代 tick 都调用updateElementPosition平滑更新元素位置形成布局动画关闭animation先layout.execute(data)再layout.stop()最后layout.tick(iterations)一次性返回迭代iterations步后的终态位置。需要注意iterations是运行时驱动的步数与某些布局内部的算法参数如力导向布局的alpha衰减策略不是同一概念对非迭代布局如grid、antv-dagre该配置不会生效。此外iterations在类型定义中归属于WebWorkerLayoutOptions见 packages/g6/src/layouts/types.ts与enableWorker同组暗示二者常配合使用于计算密集的迭代布局场景。布局动画与多布局流水线animationanimation默认false控制是否启用布局动画对于迭代布局动画表现为两次迭代之间的平滑过渡如上文onTick机制对于非迭代布局布局会一次性计算出结果随后通过updateElementPosition(layoutResult, animation)以动画形式从当前位置过渡到目标位置并await animationResult?.finished等待动画完成见 packages/g6/src/runtime/layout.ts对于树布局动画模式下会先把所有节点移动到根节点位置再统一过渡到布局结果形成展开动画见 packages/g6/src/runtime/layout.ts。此外layout配置支持传入数组以形成布局流水线postLayout会按顺序依次执行每个阶段BEFORE_STAGE_LAYOUT/AFTER_STAGE_LAYOUT每个阶段布局完成后若未开启动画则立即更新元素位置见 packages/g6/src/runtime/layout.ts。const graph new Graph({ // Other configurations... layout: [ { type: force, iterations: 500, animation: true }, { type: grid, cols: 6 }, ], });布局区域与中心width / height / centerwidth/height定义布局区域未配置时默认为画布尺寸运行时注入center定义布局中心点支持 2D[x, y]与 3D[x, y, z]供 3D 力导向布局使用。相关默认值的注入发生在 initGraphLayoutconst [width, height] viewport.getCanvasSize(); const center [width / 2, height / 2]; const config { nodeSize, width, height, center }; deepMix(layout.options, config, restOptions); // 用户配置会覆盖默认值同时该函数还会自动注入nodeSize优先取options.nodeSize否则按节点元素的实际size计算。这意味着大多数内置布局无需手动指定width/height/center即可填满画布这也是推荐做法——除非你需要将布局限制在画布的某个子区域。业务字段映射node / edgenode/edge用于把非标准的业务数据结构映射为布局所需的字段。适配层默认注入的映射packages/g6/src/utils/layout.ts如下// node 默认映射id / x / y / z / parentId / isCombo const defaultNode (datum) { const { style } datum; const parentId combo in datum ? (datum.combo ?? null) : null; return { id: idOf(datum), ...(isNumber(style?.x) ? { x: style.x } : {}), ...(isNumber(style?.y) ? { y: style.y } : {}), ...(isNumber(style?.z) ? { z: style.z } : {}), parentId, ...(isCombo(id) ? { isCombo: true } : {}), }; }; // edge 默认映射id / source / target const defaultEdge (datum) ({ id: idOf(datum), source: datum.source, target: datum.target });如果你的数据使用自定义字段名例如sourceId/targetId、posX/posY可以通过node/edge覆盖const graph new Graph({ // Other configurations... layout: { type: force, node: (datum) ({ id: datum.id, x: datum.data.posX, y: datum.data.posY }), edge: (datum) ({ id: datum.id, source: datum.data.sourceId, target: datum.data.targetId }), }, });深层原理布局适配与注册机制从源码看G6 的布局体系是一套「注册表 适配器」架构注册所有内置布局在 build-in.ts 中以layout分类注册运行时通过getExtension(layout, type)取出对应类判定initGraphLayout 判断取出的类——若其原型链上是 G6BaseLayout的直接子类则直接使用否则按isLegacyAntVLayout判断走旧版1.x适配器legacyLayoutAdapter或新版适配器layoutAdapterpackages/g6/src/utils/layout.ts执行stepLayout根据isTreeLayout分流到treeLayoutantv/hierarchy方法式布局或graphLayout类式布局见 packages/g6/src/runtime/layout.ts结果回写布局结果统一转换为{ nodes, edges, combos }的GraphData格式含style.x/y/z与边controlPoints再由updateElementPosition调用model.updateData与element.draw完成渲染更新。这套机制意味着你完全可以注册自定义布局实现或继承BaseLayout抽象类的execute方法见 base-layout.ts即可获得与内置布局一致的通用配置能力。实战示例fishbone 与 snake 布局的通用配置应用以 G6 原生实现的两种布局为例可以看到通用配置如何与布局特有参数协同fishbone鱼骨图在 layout-fishbone.ts 中通用参数与特有参数directionLR | RL默认RL、hGap/vGap、getRibSep、nodeSize组合使用const graph new Graph({ data: treeToGraphData(data), layout: { type: fishbone, vGap: 48, hGap: 48, direction: RL, }, behaviors: [drag-canvas, zoom-canvas, drag-element], });鱼骨图布局适合展示因果关系、层次结构或分类信息运行时取树的根节点为鱼头沿层次交替排列鱼刺见 fishbone.ts。snake蛇形在 layout-snake.ts 中节点按 S 型路径排布默认每行cols: 5、clockwise: true、padding: 0见 snake.ts适合在紧凑空间内展示长链结构如流程链路。其数据必须是从源节点到汇节点的线性路径——execute前会通过validate校验图连通性、源/汇节点唯一性及中间节点单前驱单后继不满足则原样返回数据见 snake.ts。两个示例都直接受width/height/center、nodeFilter、animation等通用配置的约束验证了 BaseLayout 通用配置对所有布局的一致行为。进一步阅读各内置布局的独立配置文档目录 packages/site/docs/manual/layout 下每个布局均有独立的.en.md/.zh.md说明布局类型定义与选项类型packages/g6/src/layouts/types.ts、packages/g6/src/spec/layout.ts布局运行时控制器packages/g6/src/runtime/layout.ts布局适配层与工具函数packages/g6/src/utils/layout.ts自定义布局注册方式packages/site/docs/manual/layout/custom-layout.en.md。赞分享数据可视化前端图表库【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址https://gitcode.com/gh_mirrors/g6/G6点击查看免费下载相关推荐G6 布局 API 完全指南setLayout / getLayout / layout / stopLayout 与布局配置实战G6 布局 API 完全指南setLayout / getLayout / layout / stopLayout 与布局配置实战 G6 antv/g6数据可视化前端图表库G6 图布局总览内置布局体系、注册配置与 Worker/WASM/GPU 加速实战G6 图布局总览内置布局体系、注册配置与 Worker/WASM/GPU 加速实战 导读 本文以 AntV G6JavaScript 图可视化框架的布局模数据可视化前端图表库深入 G6 自定义布局从 BaseLayout 到注册与配置的完整实战指南深入 G6 自定义布局从 BaseLayout 到注册与配置的完整实战指南 在 AntV G6 packages/g6 https://link.gitco数据可视化前端图表库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

OpenAI自研芯片背后:AI辅助芯片设计的技术路径与行业影响

OpenAI自研芯片背后:AI辅助芯片设计的技术路径与行业影响

芯片行业今年最热门的话题,不是又发布了多少TOPS算力,而是OpenAI——这家靠软件和算法起家的公司——居然动起了自研芯片的念头。更值得琢磨的是,当OpenAI这样的AI巨头要造芯片时,它很难绕开一个反身性问题:既然我们有…

2026/9/25 9:22:42 阅读更多 →
Python轻量级驾驶员疲劳检测系统实战:光照遮挡鲁棒性与边缘部署

Python轻量级驾驶员疲劳检测系统实战:光照遮挡鲁棒性与边缘部署

简介:这是一套面向计算机专业本科生的高分毕业设计实战资源,聚焦驾驶员疲劳状态识别这一典型AI落地场景,基于Python与卷积神经网络实现端到端的人脸检测、关键点定位与闭眼/打哈欠等疲劳特征判别,并集成实时预警功能。资源适用于毕…

2026/9/25 3:30:54 阅读更多 →
五子棋人机AI从入门到优化:Minimax、剪枝与启发式评估全解析

五子棋人机AI从入门到优化:Minimax、剪枝与启发式评估全解析

简介:一款基于VC开发的五子棋人机对战源码包,适合对人工智能算法与游戏编程感兴趣的C学习者。项目演示了Minimax搜索和Alpha-Beta剪枝在棋类决策中的应用,并结合启发式函数评估局面,使电脑能根据棋子分布、连珠潜力做出合理应对&a…

2026/9/25 4:49:07 阅读更多 →

最新新闻

Windows下MinGW-w64完整包安装教程:从选型、配置到避坑全指南

Windows下MinGW-w64完整包安装教程:从选型、配置到避坑全指南

简介:面向Windows平台C/C开发者的MinGW mingw64完整配置包,适合刚接触GNU工具链、需要快速搭建本地编译环境的初学者。压缩包共2000个文件,约129.46MB,以h/hpp头文件和Python脚本为主,另有c源码、txt说明、shell脚本与…

2026/9/25 22:59:21 阅读更多 →
ModLens Guard 机制源码解读:如何精准嗅探模型有无视觉能力,杜绝无效图片调用

ModLens Guard 机制源码解读:如何精准嗅探模型有无视觉能力,杜绝无效图片调用

ModLens Guard 机制源码解读:如何精准嗅探模型有无视觉能力,杜绝无效图片调用 【免费下载链接】modlens The first vision plugin for DeepSeek Harness, and the vision bridge for every text-only coding agent. Paste an image, get structured JSON…

2026/9/25 22:59:21 阅读更多 →
bb SDK 编程指南:用 BBSdk 以代码驱动你的 AI 编码工作流

bb SDK 编程指南:用 BBSdk 以代码驱动你的 AI 编码工作流

bb SDK 编程指南:用 BBSdk 以代码驱动你的 AI 编码工作流 【免费下载链接】bb The agent IDE that builds itself 项目地址: https://gitcode.com/gh_mirrors/bb14/bb bb 是一款「自我构建的智能体 IDE(agentic IDE)」,而 …

2026/9/25 22:59:21 阅读更多 →
Flutter实战:AI对话App开发环境搭建与核心链路解析

Flutter实战:AI对话App开发环境搭建与核心链路解析

1. 立项复盘:这个AI对话App为什么最终选了Flutter那周产品例会开了二十分钟,需求就一句话:"我们要做一个AI对话App,手机上能用,先上Android和iOS。"听完这句话,我脑子里先闪过三个技术选型&#…

2026/9/25 22:59:21 阅读更多 →
C# + OpenVINO + 异步推理:YOLO 实时检测流水线优化与 FPS 提升实践

C# + OpenVINO + 异步推理:YOLO 实时检测流水线优化与 FPS 提升实践

简介:这份资源是一套C#结合OpenVINO部署YOLO模型并实现异步推理的完整工程与教程资料,面向希望在高帧率场景下(如150FPS以上)做实时目标检测的开发者。资源涵盖模型转换、IR格式优化、C#环境配置及异步推理关键代码,适…

2026/9/25 22:59:21 阅读更多 →
七星卫通技术专业吗

七星卫通技术专业吗

从北斗卫星导航系统完成全球组网,到天通一号卫星移动通信系统建成,国产卫星通信产业从追赶到并跑,从单点突破到体系成型,走过了十余年的攻坚旅程。在这片关乎信息安全、关乎极端场景通信保障的蓝海中,北京七星卫通科技…

2026/9/25 22:58:20 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →