G6 ComboCombined 复合布局:从配置到源码的完整实战指南
G6 ComboCombined 复合布局从配置到源码的完整实战指南【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址: https://gitcode.com/gh_mirrors/g6/G6本指南围绕 G6antv/g6内置的 ComboCombined 复合布局展开讲解它如何在同一张图中为 Combo 内部元素与最外层 Combo/节点分别编排布局覆盖全部配置项说明、按层级动态指定布局的进阶用法、可直接运行的完整示例并深入到 G6 源码与测试用例帮助读者在用户画像、供应链等复合分组场景中快速落地并理解其底层执行机制。概述ComboCombined复合布局type 为combo-combined是 G6 面向复合分组结构图数据设计的布局方案。它允许在一张图中灵活配置两层布局内部布局innerLayoutCombo 内部元素之间的布局方式外部布局outerLayout最外层 Combo 与游离节点之间的布局方式。默认情况下内部元素采用 Concentric 同心圆布局外部布局采用 gForce 力导向布局从而在布局效果与整体稳定性之间取得平衡。从实现上看ComboCombinedLayout并非 G6 自研而是由布局库antv/layout提供G6 在 layouts/index.ts 中将其与其他布局Circular、Dagre、Force、Fruchterman、Grid、Radial 等一同导出并通过内置注册表将字符串combo-combined映射到该类见 build-in.ts。这意味着在Graph配置中直接写type: combo-combined即可使用无需额外引入。使用场景复合布局面向“数据天然具有分组层级”的图结构典型场景包括用户画像分析将用户兴趣圈层作为 Combo内部节点展示具体商品和行为标签通过边表达用户行为与商品的关系帮助运营人员识别用户消费路径。供应链管理图供应商、制造商、仓储、分销商按角色或区域划分 Combo内部节点展示资源、人员或设备清晰展示供应链各环节的内部结构同时外层仍能保持整体布局的可读性。这类场景的共同特征是分组内部需要紧凑、规律的排列如同心圆分组之间则希望通过力导向等布局自然疏离——这正是 ComboCombined 双层布局的设计初衷。配置项ComboCombined 布局支持以下配置项属性描述类型默认值必选type布局类型combo-combined-✓center布局中心PointTuple图中心layout布局配置。可固定指定也可根据comboId动态返回string|object|(comboId?: string) string \| object-nodeSize节点大小直径。用于碰撞检测number|number[]|(d?: NodeData) number-nodeSpacing节点间距number|(d?: NodeData) number-comboSpacingCombo 之间的间距number|(d?: unknown) number-comboPaddingCombo 内部的 padding 值不用于渲染仅用于计算力。推荐设置为与视图上 Combo 内部 padding 值相同的值((d?: unknown) number)|number|number[]|undefined-要点说明type必填取值为combo-combined用于在 G6 内置注册表中定位布局实现。center布局的几何中心不传时默认为图画布中心。nodeSize / nodeSpacing两者都参与碰撞检测。nodeSize是节点的直径nodeSpacing是节点之间的间隙均支持传函数按节点动态计算——函数的入参即 NodeData 节点数据可基于节点属性返回个性化数值。comboSpacing控制 Combo 与 Combo 之间的距离。comboPadding⚠️ 特别注意该值不参与渲染仅用于力计算。它应当与视图上 Combo 的真实内部 padding即 combo 样式中的padding保持一致否则力计算边界与实际显示范围会出现偏差。上述各间距/尺寸参数在 G6 测试用例中有直接应用可参考 layout-combo-combined.tslayout: { type: combo-combined, comboPadding: 10, nodeSpacing: 20, comboSpacing: 80, },这里comboPadding: 10与同一 demo 中 combo 样式的padding: 10layout-combo-combined.ts保持一致正是文档推荐用法的实践范例。layout 字段详解类型string | object | (comboId?: string) string | object自 G6 5.1 版本起官方推荐使用单个layout字段为不同层级选择布局而不是分别配置innerLayout与outerLayout旧字段已被取代。layout支持三种形态字符串直接指定某一种布局类型如grid对象指定布局类型及其参数如{ type: grid, cols: 4 }函数接收comboId参数可选返回布局类型字符串或配置对象实现按层级动态分发布局。函数形态示例new Graph({ layout: { type: combo-combined, layout: (comboId) (comboId ? { type: grid } : { type: force }), }, });上述代码表达的策略是当comboId存在即当前是某个 Combo 的内部元素时使用grid网格布局当comboId为空即最外层 Combo 与游离节点时使用force力导向布局。由此可以实现“内部规整、外部受力牵引”的混合效果。完整示例代码以下示例加载 G6 官方示例数据含 Combo 分组的图数据使用 ComboCombined 布局并开启拖拽、缩放等交互。完整代码也保存在 站点示例 demo/combo-combined.js 中import { Graph } from antv/g6; fetch(https://assets.antv.antgroup.com/g6/combo.json) .then((res) res.json()) .then((data) { const graph new Graph({ container: container, data, layout: { type: combo-combined, comboPadding: 2, }, node: { style: { size: 20, labelText: (d) d.id, }, palette: { type: group, field: (d) d.combo, }, }, edge: { style: (model) { const { size, color } model.data; return { stroke: color || #99ADD1, lineWidth: size || 1, }; }, }, behaviors: [drag-element, drag-canvas, zoom-canvas], autoFit: view, }); graph.render(); });示例中的几个关键点数据combo.json是包含 combo 分组关系的官方示例数据集仓库中的同名数据集位于 packages/g6/tests/dataset/combo.json可直接用于本地测试。节点调色板palette配置为group类型并按d.combo分组取色让不同 Combo 的节点一眼可辨。边样式根据边的原始数据动态设置描边色与线宽。交互与视野配置drag-element、drag-canvas、zoom-canvas三个内置行为并开启autoFit: view渲染后自动将整图适配到视口。注意示例数据通过远程地址 fetch 获取若在离线或内网环境可改用本地 JSON 文件或直接以对象形式传入data。源码视角布局是如何被调度执行的ComboCombined 布局在 G6 中的执行链路清晰理解它有助于排查布局不生效、位置异常等问题。1. 注册与解析G6 内置注册表 build-in.ts 中登记了combo-combined: ComboCombinedLayout。当你在layout中声明type: combo-combined时G6 会通过 registry 机制解析出对应的布局类并实例化。该布局类从antv/layout导入见 layouts/index.ts因此布局的核心算法内部同心圆 外部力导向、碰撞检测、间距计算由antv/layout提供。2. 运行时调度布局由 LayoutController 统一调度。其中preLayoutruntime/layout.ts#L62-L88在首次绘制前执行布局结果模拟出的 nodes/edges/combos 位置通过simulate()获得并回写到节点、边、Combo 的样式node.style、edge.style、combo.style中postLayoutruntime/layout.ts#L96-L117则在绘制完成后执行支持传入布局管线数组按顺序执行多个布局。布局前后会触发BEFORE_LAYOUT/AFTER_LAYOUT、BEFORE_STAGE_LAYOUT/AFTER_STAGE_LAYOUT等生命周期事件可在这些事件中监听并干预布局过程。此外布局执行时会向模型回写数据model.syncNodeLikeDatum等保证图数据与画布位置同步。3. Combo 数据参与布局postLayout阶段会从模型读取 nodes、edges、combos 三类数据runtime/layout.ts#L294并按comboFilter筛选需要参与布局的 Combo最终将 Combo 与普通节点一并交给布局算法处理这正是 ComboCombined 能够“内层外层一起排”的数据基础。测试验证仓库如何保证布局质量G6 为 ComboCombined 布局提供了快照测试见 combo-layout.spec.tsit(combined, async () { const graph await createDemoGraph(layoutComboCombined); await expect(graph).toMatchSnapshot(__filename, combined); graph.destroy(); });测试通过createDemoGraph渲染 layoutComboCombined 这个 demo即上文配置了comboPadding: 10、nodeSpacing: 20、comboSpacing: 80的场景并将渲染结果与 SVG 快照比对。值得注意的细节是测试在beforeEach中调用了mockRandom()固定随机数——这是因为外层默认的力导向布局gForce依赖随机初始化固定随机种子可以保证快照可复现。如果你在自己的应用中通过组合布局得到了“每次渲染位置都不一样”的结果这正是力导向布局随机初始化的正常表现属于预期行为。相关资源布局总览manual/layout/overview.zh.md布局基类 BaseLayoutmanual/layout/BaseLayout.zh.md站点示例含可交互 Demo 与截图examples/layout/combo-layout/index.zh.md布局实现导出packages/g6/src/layouts/index.ts内置注册packages/g6/src/registry/build-in.ts布局运行时调度packages/g6/src/runtime/layout.ts单元测试packages/g6/tests/unit/layouts/combo-layout.spec.ts【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址: https://gitcode.com/gh_mirrors/g6/G6创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

吃糖牙疼别硬扛,面试必问的异步回调坑

吃糖牙疼别硬扛,面试必问的异步回调坑

吃糖牙疼别硬扛,面试必问的异步回调坑 看了一堆教程还是不会写项目?别急,先看看这个。 很多后端工程师在面试时,被问到“如何处理高并发下的异步任务回调”时,往往卡壳。这道题是 面试必问 的经典场景,它不像 LeetCode…

2026/9/23 18:00:14 阅读更多 →
除数等于零报错频发?这份速查手册救了你

除数等于零报错频发?这份速查手册救了你

除数等于零报错频发?这份速查手册救了你 你是不是也遇到过这种情况:语法书翻烂了,代码看着挺顺眼,一到真实项目里就崩。特别是当涉及数据计算、动态参数传递时, ZeroDivisionError 或者 NaN…

2026/9/23 17:59:14 阅读更多 →
别再盲目试 AI 论文工具!应届生选工具,记住这几个核心判断标准

别再盲目试 AI 论文工具!应届生选工具,记住这几个核心判断标准

临近毕业季,打开社交平台,铺天盖地全是各类 AI 论文工具推荐。不少应届生病急乱投医,看到广告就注册,下载一堆软件来回切换,钱花了不少,毕设问题却没解决。有的工具只能写文字,没法做图表&#…

2026/9/23 17:59:14 阅读更多 →

最新新闻

KMeans聚类在宿舍分配中的实战:特征工程到K值选择

KMeans聚类在宿舍分配中的实战:特征工程到K值选择

简介:针对高校宿舍分配场景,这份基于KMeans聚类算法的Python源码包提供了从数据预处理、模型训练到结果可视化的完整实现,适合需要将无监督学习落地到实际管理问题的数据科学初学者或高校信息管理相关技术人员。压缩包共13个文件,…

2026/9/23 18:38:49 阅读更多 →
fpm 构建 Solaris SRV4 软件包(solaris 输出格式)完全指南

fpm 构建 Solaris SRV4 软件包(solaris 输出格式)完全指南

fpm 构建 Solaris SRV4 软件包(solaris 输出格式)完全指南 【免费下载链接】fpm Effing package management! Build packages for multiple platforms (deb, rpm, etc) with great ease and sanity. 项目地址: https://gitcode.com/gh_mirrors/fp/fpm …

2026/9/23 18:38:49 阅读更多 →
Java Swing数独游戏工程级实现与难度控制

Java Swing数独游戏工程级实现与难度控制

简介:本资源是一份面向Java初学者与课程设计实践者的完整数独小游戏开发项目,适用于高校Java程序设计、GUI编程或软件工程类课程作业参考。项目基于Swing构建图形界面,代码结构清晰,涵盖游戏逻辑、难度生成、用户交互及资源管理等…

2026/9/23 18:38:49 阅读更多 →
Fedora开发环境避坑指南:保姆级教程解决常见报错

Fedora开发环境避坑指南:保姆级教程解决常见报错

Fedora开发环境避坑指南:保姆级教程解决常见报错 盯着屏幕上一片红色的StackTrace,是不是感觉脑子瞬间宕机?刚把Fedora装好,连个Python环境都跑不通,报错信息长得像天书,根本不知道从哪下手。别慌,这份保姆级教程就是为你…

2026/9/23 18:38:49 阅读更多 →
基于 TVM 编译栈的 WebAssembly 独立深度学习推理:wasm-standalone 项目实战解析

基于 TVM 编译栈的 WebAssembly 独立深度学习推理:wasm-standalone 项目实战解析

编译器深度学习模型优化 【免费下载链接】tvm Open deep learning compiler stack for cpu, gpu and specialized accelerators 项目地址: https://gitcode.com/gh_mirrors/tvm7/tvm 点击查看 免费下载 本文围绕仓库中的 apps/wasm-standalone 实验性项目&#xff…

2026/9/23 18:38:48 阅读更多 →
2026最新怎么注册营业执照,程序员如何搭建个人开发环境

2026最新怎么注册营业执照,程序员如何搭建个人开发环境

2026最新怎么注册营业执照,程序员如何搭建个人开发环境 刚学会Python语法,打开VS Code却不知从何下手?这是90%新手最真实的困境。2026最新的技术栈迭代很快,但基础项目搭建逻辑没变。很多教程只讲“怎么写代码”,却忽略了“怎么…

2026/9/23 18:37:48 阅读更多 →

日新闻

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 阅读更多 →