G6 网格布局(GridLayout)完全指南:配置参数、源码原理与实践案例
G6 网格布局GridLayout完全指南配置参数、源码原理与实践案例【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址: https://gitcode.com/gh_mirrors/g6/G6网格布局Grid是 G6 中将节点按行列整齐排列的经典布局方案特别适合需要以矩阵、表格形态展示数据关系的场景。本文以packages/site/docs/manual/layout/GridLayout.zh.md为骨架结合 G6 源码中布局注册、参数透传与数据适配的实现细节系统讲解 grid 布局的完整配置项、防重叠机制、排序逻辑与位置指定技巧帮助你快速落地整齐、可控的网格化图编排。概述与适用场景网格布局将节点按照网格形式排列适用于需要整齐排列节点的场景。该布局支持两种行列确定方式自动计算根据节点数量、布局空间推算行列数与手动指定直接设置cols/rows并内置了防止节点重叠的碰撞检测能力。从源码看G6 将grid布局作为内置布局直接注册进构建期扩展库registry/build-in.ts 中的grid: GridLayout即指向从antv/layout导出的GridLayout见 layouts/index.ts类型上由GridLayoutOptions与BaseLayoutOptions合并而成见 layouts/types.ts因此它天然支持animation、enableWorker、nodeFilter等通用布局能力。典型应用场景在数据可视化中需要展示矩阵或表格形式的数据关系需要对一组同构节点做等距、对齐的规整排布如网格状面板、宫格卡片需要按某个字段如度数、聚类簇、自定义权重将节点由中心向外有序放置。快速上手基础用法最简单的配置方式只需指定布局类型与行列数const graph new Graph({ layout: { type: grid, cols: 5, rows: 5, }, data: { nodes: Array.from({ length: 25 }, (_, i) ({ id: node-${i}, data: { value: Math.random() * 100, }, })), edges: Array.from({ length: 20 }, (_, i) ({ id: edge-${i}, source: node-${Math.floor(Math.random() * 25)}, target: node-${Math.floor(Math.random() * 25)}, })), }, });在此基础上叠加画布尺寸、节点样式、标签与配色即可得到一份可直接运行的完整示例import { Graph } from antv/g6; const graph new Graph({ container: container, width: 600, height: 400, layout: { type: grid, cols: 5, rows: 5, }, data: { nodes: Array.from({ length: 25 }, (_, i) ({ id: node-${i}, data: { value: Math.random() * 100, }, })), edges: Array.from({ length: 20 }, (_, i) ({ id: edge-${i}, source: node-${Math.floor(Math.random() * 25)}, target: node-${Math.floor(Math.random() * 25)}, })), }, node: { style: { size: 20, label: true, labelText: (datum) datum.id, labelBackground: true, }, }, edge: { style: { stroke: #bfbfbf, }, }, }); graph.render();注意在 G6 中使用当前容器的宽度/高度作为 grid 布局width/height的默认值单独使用此布局时默认值为300。配置方式在实例化Graph时通过layout字段传入配置对象即可const graph new Graph({ layout: { type: grid, begin: [0, 0], cols: 5, rows: 5, width: 300, height: 300, preventOverlap: true, nodeSize: 30, condense: false, }, });其中type: grid是必选项用于在布局注册表中定位到内置的GridLayout实现。layout支持传入单个配置对象也支持传入配置数组组成布局流水线见 runtime/layout.ts 中postLayout对 pipeline 的循环处理多个布局可依次作用于节点。配置项详解原文档给出的完整配置项如下属性描述类型默认值必选type布局类型grid-✓begin网格开始位置左上角默认为[0, 0][number, number][0, 0]cols网格的列数为 undefined 时算法根据节点数量、布局空间、rows若指定自动计算numberundefinedrows网格的行数为 undefined 时算法根据节点数量、布局空间、cols若指定自动计算number10width布局区域宽度在 G6 中使用当前容器的宽度作为默认值number300height布局区域高度在 G6 中使用当前容器的高度作为默认值number300condense为 false 时表示利用所有可用画布空间为 true 时表示利用最小的画布空间booleanfalsenodeSize节点大小直径用于防止节点重叠时的碰撞检测Size | ((nodeData: Node) Size)-nodeSpacing节点间距用于调整节点之间的间隔((node?: Node) number) | number-position指定每个节点所在的行和列(node?: Node) { row?: number; col?: number; }undefinedpreventOverlap是否防止节点重叠需要配合 nodeSize 或节点数据中的 size 属性使用booleanfalsepreventOverlapPadding避免重叠时节点的间距 paddingpreventOverlap 为 true 时生效number10sortBy指定排序的依据节点属性名数值越高则该节点被放置得越中心。若为 undefined则会计算节点的度数度数越高节点将被放置得越中心stringundefined下面逐项展开关键配置的行为与细节。begin网格起点begin决定网格左上角第一个节点的坐标默认[0, 0]。当你不希望节点从画布原点开始排布时例如为顶部标题、侧边面板预留空间可设置为begin: [50, 50]。cols / rows行列控制cols未指定时算法会根据节点数量、布局空间width/height以及rows若指定自动计算列数rows未指定时算法会根据节点数量、布局空间以及cols若指定自动计算行数两者同时指定时网格严格按给定行列排布多余节点会溢出到新行或新列。width / height布局区域限制网格整体占据的空间范围。默认值取决于运行环境在 G6 中取当前容器尺寸脱离容器单独使用布局库时默认300。condense压缩网格空间condense: false默认利用所有可用画布空间节点会被均匀铺满整个width×height区域condense: true只利用最小画布空间网格按照节点实际数量紧凑排布不刻意撑满布局区域。nodeSize / nodeSpacing节点尺寸与间距nodeSize表示节点直径用于防重叠时的碰撞检测支持固定数值或按节点数据动态返回的函数形式(nodeData) SizenodeSpacing用于调整节点之间的间隔支持数值或函数(node) number。preventOverlap防重叠开关boolean 默认值false是否防止节点重叠。必须配合nodeSize或节点数据中的size属性使用只有两种途径之一在数据中设置了data.size或在布局中配置了与当前图节点大小相同的nodeSize值才能进行节点重叠的碰撞检测。preventOverlapPadding防重叠间距number 默认值10避免重叠时节点的间距 padding仅在preventOverlap: true时生效。数值越大相邻节点在防重叠计算后留出的空隙越大。sortBy中心化排序string 默认值undefined指定排序依据的节点属性名数值越高则该节点被放置得越中心。若为undefined布局会计算节点的度数度数越高节点将被放置得越中心。从源码角度G6 在将图数据适配给底层antv/layout时对sortBy做了专门兼容网格布局会直接读取节点data[sortBy]字段因此适配层会把节点的data、style等字段扁平展开进布局模型见 utils/layout.ts 中的注释与实现。这意味着sortBy: id时按节点 id 排布sortBy: value时按自定义数据字段排序value大的节点更靠近中心也可以传入比较函数见下文 demo 中的(n1, n2) Number(n2.data.cluster) - Number(n1.data.cluster)实现任意自定义排序规则。position手动指定行列(node?: Node) { row?: number; col?: number; }默认值undefined允许为特定节点精确指定其所在行和列。返回undefined的节点则继续走自动布局逻辑。该能力非常适合锚定关键节点的需求——例如把入口节点固定在左上角、把出口节点固定在右下角其余节点自动填充。进阶示例自定义配置通过组合上述配置项可以实现更精细的网格排布如从[50, 50]起点开始、4 列 6 行、防重叠、紧凑布局、按value中心化排序const graph new Graph({ layout: { type: grid, begin: [50, 50], // 从坐标 [50, 50] 开始布局 cols: 4, // 指定 4 列 rows: 6, // 指定 6 行 width: 400, // 布局区域宽度 height: 600, // 布局区域高度 preventOverlap: true, // 防止节点重叠 nodeSize: 30, // 节点大小 condense: true, // 使用最小空间 sortBy: value, // 按 value 属性排序 }, data: { nodes: Array.from({ length: 24 }, (_, i) ({ id: node-${i}, data: { value: Math.random() * 100, // 用于排序的属性 }, })), edges: Array.from({ length: 20 }, (_, i) ({ id: edge-${i}, source: node-${Math.floor(Math.random() * 24)}, target: node-${Math.floor(Math.random() * 24)}, })), }, });带渲染的可运行版本含按value分组配色的节点样式import { Graph } from antv/g6; const graph new Graph({ container: container, width: 600, height: 400, layout: { type: grid, begin: [50, 50], cols: 4, rows: 6, width: 400, height: 600, preventOverlap: true, nodeSize: 30, condense: true, sortBy: value, }, data: { nodes: Array.from({ length: 24 }, (_, i) ({ id: node-${i}, data: { value: Math.random() * 100, }, })), edges: Array.from({ length: 20 }, (_, i) ({ id: edge-${i}, source: node-${Math.floor(Math.random() * 24)}, target: node-${Math.floor(Math.random() * 24)}, })), }, node: { style: { size: 20, label: true, labelText: (datum) datum.id, labelBackground: true, }, palette: { type: group, field: (datum) datum.data.value, color: [#1783FF, #00C9C9, #F08F56, #D580FF], }, }, edge: { style: { stroke: #bfbfbf, }, }, }); graph.render();进阶示例指定节点位置通过position属性为特定节点指定行列其余节点自动布局const graph new Graph({ layout: { type: grid, cols: 5, rows: 5, position: (node) { // 为特定节点指定位置 if (node.id node-0) return { row: 0, col: 0 }; // 左上角 if (node.id node-1) return { row: 0, col: 4 }; // 右上角 if (node.id node-2) return { row: 4, col: 0 }; // 左下角 if (node.id node-3) return { row: 4, col: 4 }; // 右下角 return undefined; // 其他节点自动布局 }, }, data: { nodes: Array.from({ length: 25 }, (_, i) ({ id: node-${i}, })), edges: Array.from({ length: 20 }, (_, i) ({ id: edge-${i}, source: node-${Math.floor(Math.random() * 25)}, target: node-${Math.floor(Math.random() * 25)}, })), }, });可运行版本import { Graph } from antv/g6; const graph new Graph({ container: container, width: 600, height: 400, layout: { type: grid, cols: 5, rows: 5, position: (node) { if (node.id node-0) return { row: 0, col: 0 }; if (node.id node-1) return { row: 0, col: 4 }; if (node.id node-2) return { row: 4, col: 0 }; if (node.id node-3) return { row: 4, col: 4 }; return undefined; }, }, data: { nodes: Array.from({ length: 25 }, (_, i) ({ id: node-${i}, })), edges: Array.from({ length: 20 }, (_, i) ({ id: edge-${i}, source: node-${Math.floor(Math.random() * 25)}, target: node-${Math.floor(Math.random() * 25)}, })), }, node: { style: { size: 20, label: true, labelText: (datum) datum.id, labelBackground: true, }, }, edge: { style: { stroke: #bfbfbf, }, }, }); graph.render();交互式调参setLayout 动态更新网格布局支持运行时动态调整参数。原文档的在线体验示例展示了借助 GUI 面板实时调节cols、rows、width、height、preventOverlap、nodeSize、condense的交互方式其核心是graph.setLayout与graph.layout()的组合const options { type: grid, cols: 5, rows: 5, width: 400, height: 400, preventOverlap: true, nodeSize: 30, condense: false, }; // GUI 面板中任一参数变化时 optionFolder.onChange(({ property, value }) { graph.setLayout({ type: grid, [property]: value, }); graph.layout(); });配合一个 25 节点、20 条随机边的图数据节点带value分组配色即可实时观察不同参数对网格排布的影响。站点侧的真实示例可参考 layout/grid/demo/basic.js其中通过下拉框在sortBy: id与sortBy: cluster之间切换并调用setLayout重排。源码原理grid 布局在 G6 中的工作链路1. 注册与解析grid布局在 registry/build-in.ts 中注册为内置布局对应的实现类是antv/layout导出的GridLayout见 layouts/index.ts。G6 的布局控制器LayoutController在postLayout中遍历布局流水线逐个执行stepLayout并触发BEFORE_LAYOUT/AFTER_LAYOUT生命周期事件见 runtime/layout.ts。2. 数据适配sortBy 的兼容处理G6 会把图数据转换为底层布局库所需的模型。针对 grid 布局直接读取data[sortBy]的特性utils/layout.ts 在graphData2LayoutModel中将节点的data、style等字段展开合并进data对象同时注释特别提醒适配层会避免用户数据中使用data、style等保留字段。此外节点已有的style.x/style.y也会被同步到布局模型的data.x/data.y中供需要读取初始位置的布局使用。3. 测试与性能验证单元测试unit/layouts/grid.spec.ts 覆盖了sortBy默认行为与sortBy: id两种场景的 SVG 快照断言并在测试中通过graph.setLayout({ type: grid, sortBy: id })graph.layout()验证动态重排功能 demodemos/layout-grid.ts 展示了sortBy支持字符串id、degree与函数按cluster倒序两种形式性能基线perf/draw.perf.ts 以layout: { type: grid }作为基准之一对 100 到 10000 节点的绘制与布局耗时进行评测可作为网格布局在大规模节点下的性能参考。相关资源布局配置规范spec/layout.ts布局类型定义与选项layouts/types.ts布局运行控制器runtime/layout.ts网格布局实际案例layout/grid/demo/basic.js掌握cols/rows自动与手动控制、preventOverlap防重叠、sortBy中心化排序以及position定点锚定这四个核心能力你就能在 G6 中快速构建出整齐、可控、可交互的网格化图布局。【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址: https://gitcode.com/gh_mirrors/g6/G6创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

备考CCNA题库卡顿?一文搞懂性能优化与高频考点

备考CCNA题库卡顿?一文搞懂性能优化与高频考点

备考CCNA题库卡顿?一文搞懂性能优化与高频考点 刚把网上那份热门的 CCNA 题库 Excel 表复制到本地,双击运行脚本,进度条卡死不动。你盯着屏幕,心里骂娘:代码明明没报错,为什么跑起来跟蜗牛爬似的?别急,这不是你电脑配置差,也不是网…

2026/9/23 16:43:39 阅读更多 →
投子认输避坑指南:从入门到精通搞定项目落地

投子认输避坑指南:从入门到精通搞定项目落地

投子认输避坑指南:从入门到精通搞定项目落地 是不是刚啃完语法书,面对空白的IDE还是两眼一抹黑?很多开发者都卡在“学会语法却不知怎么搭项目”这个死结上。别慌,今天咱们把【投子认输】这个概念掰开揉碎了讲,带你从【入门到精通】真正搞定项目架构。…

2026/9/23 16:43:39 阅读更多 →
动态爬虫性能优化实战:解决代码跑不通的3个核心瓶颈

动态爬虫性能优化实战:解决代码跑不通的3个核心瓶颈

动态爬虫性能优化实战:解决代码跑不通的3个核心瓶颈 复制来的动态爬虫代码一运行就报错,或者页面加载到一半就卡死,这是不是让你抓狂?别急着改代码,90%的问题都出在 性能优化…

2026/9/23 16:43:39 阅读更多 →

最新新闻

3步搞定阿里云邮箱企业版配置,一文搞懂避坑指南

3步搞定阿里云邮箱企业版配置,一文搞懂避坑指南

3步搞定阿里云邮箱企业版配置,一文搞懂避坑指南 配置SMTP环境就卡半天?别急,很多人卡在认证方式或端口设置上。本文旨在 一文搞懂 阿里云邮箱企业版的核心配置逻辑。…

2026/9/23 17:56:12 阅读更多 →
上海游戏培训避坑:5道高频面试题拆解证书含金量

上海游戏培训避坑:5道高频面试题拆解证书含金量

上海游戏培训避坑:5道高频面试题拆解证书含金量 面试被问原理答不上来,心里慌不慌?在【上海游戏培训】圈子里,这种尴尬太常见了。很多学员花大几万学费,回去一问证书怎么查、和别的岗位有啥区别,支支吾吾说不出个所以然。这不仅是面子问题,更是硬伤。…

2026/9/23 17:56:12 阅读更多 →
基于LSTM的淘宝商品评论分析系统:从评论文本到情感判定的完整落地路径

基于LSTM的淘宝商品评论分析系统:从评论文本到情感判定的完整落地路径

简介:这份资源是面向NLP入门者与电商数据分析学习者的完整项目包,以LSTM循环神经网络为核心,解决淘宝商品评论的情感倾向识别与文本分类问题。项目从词向量、序列建模到模型训练与前端展示形成闭环,适合课程设计、毕业设计或算法练…

2026/9/23 17:56:12 阅读更多 →
手写数字抽奖系统避坑指南 搞定随机算法不翻车

手写数字抽奖系统避坑指南 搞定随机算法不翻车

手写数字抽奖系统避坑指南 搞定随机算法不翻车 面对屏幕上那串红色的 StackTrace,是不是脑子直接宕机了?明明照着教程敲的代码,一运行就抛出 IndexOutOfBoundsException 或者…

2026/9/23 17:56:12 阅读更多 →
中彩网双色球预测手写实现性能优化实战

中彩网双色球预测手写实现性能优化实战

中彩网双色球预测手写实现性能优化实战 看了一堆教程还是不会写项目?别慌,这不是你的问题,是教程没教你怎么把代码跑快。 很多应届生做 中彩网双色球预测 这种数据处理项目,上来就无脑 for 循环。数据量一上来,程序卡死,CPU…

2026/9/23 17:56:11 阅读更多 →
安卓界面设计避坑指南:解决布局错乱与性能卡顿

安卓界面设计避坑指南:解决布局错乱与性能卡顿

安卓界面设计避坑指南:解决布局错乱与性能卡顿 配置环境卡半天,代码一跑界面就崩,这种绝望感谁懂?刚接手的安卓项目,XML 写得再漂亮,真机一预览全是错位、重叠或者白屏。别急着怀疑自己水平不行,大概率是掉进了布局引擎的陷阱。这份避坑指南不是讲…

2026/9/23 17:55:11 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

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

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

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

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

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

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

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

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

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

2026/9/23 9:53:41 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/23 9:53:40 阅读更多 →