数据可视化前端图表库【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址https://gitcode.com/gh_mirrors/g6/G6点击查看免费下载导读D3Force 是 G6JavaScript 图可视化框架内置的力导向布局force-directed layout基于 d3-force 实现。它通过模拟引力、斥力、碰撞等物理作用力让图自动收敛到能量最小化的稳定状态天然适合社交网络、组织架构、知识图谱等没有固定排布规则的场景。读完本篇你将掌握 d3-force 布局的五大力模型与迭代原理、全部配置参数的含义与默认值并能在实际项目中通过参数组合实现防节点重叠、团队聚类、节点固定等真实效果。核心概念力导向布局如何工作力导向布局的核心思想是把图看成一个物理世界节点之间存在多种同时作用、最终达到平衡的力。整个过程无需手动指定节点位置系统会自动寻找合适的排布。主要特性自动排布无需手工设置节点坐标布局自动寻找合适位置实时调整拖拽节点时其他节点会实时响应并调整位置灵活配置可调节节点间引力和斥力、设置边理想长度、固定关键节点位置动画效果节点平滑移动变化过程自然流畅五大力模型D3Force 布局模拟五种不同的力想象一个物理世界中这些力同时作用并最终达到平衡力物理类比作用Link Force连线力橡皮筋连接节点将相连节点拉到合适距离橡皮筋的松紧程度即力的强度理想长度即我们设定的距离Many-Body Force多体力磁铁让所有节点相互吸引或排斥。力强度为负时相互排斥同极相斥为正时相互吸引异极相吸。该力决定图的疏密程度Center Force中心力隐形绳子绑在画布中心防止节点漂移过远让图整体居中Collision Force碰撞力实心球体节点过近时自动弹开主要防止节点重叠、提升可读性Radial Force径向力隐形圆环将节点吸引到圆环上通过设置半径与力强度可使节点形成美观的圆形布局注示意图中不同颜色的箭头代表不同类型的力。在实际布局中这些力不可见且会互相影响。在 G6 中d3-force是内置布局之一注册于 packages/g6/src/registry/build-in.ts 的layout分类下并经由 packages/g6/src/layouts/index.ts 从antv/layout导入D3ForceLayout实现。因此你无需额外注册即可直接使用layout: { type: d3-force }。迭代系统Alpha 值与迭代次数布局计算是一个迭代过程有两个关键概念Alpha 值能量Alpha 相当于布局的能量决定节点运动的剧烈程度初始状态alpha 1节点剧烈运动计算过程中alpha 逐渐衰减节点运动变慢结束状态当alpha alphaMin时节点停止运动迭代次数Iterations控制每次计算中作用力的施加次数效果数值越大布局越精确但计算越慢调整策略简单图使用默认值即可复杂图按需增大迭代次数实时交互场景使用较少的迭代次数提示迭代次数与 alpha 值协同工作。增大迭代次数使每一步更精确而 alpha 控制整体收敛进度。布局选项Options完整参数表属性说明类型默认值必填type布局类型stringd3-force✓centerX布局中心 x 坐标numberwidth / 2centerY布局中心 y 坐标numberheight / 2centerStrength中心力强度number-nodeSize节点尺寸直径用于碰撞检测number | ((node, index, nodes) number)10nodeSpacing节点间额外间距number | ((node, index, nodes) number)0iterations力的迭代次数越大越精确number-onTick每次迭代的回调用于实时获取结果(data: LayoutMapping) void-forceSimulation自定义力模拟默认使用 d3.js 方法SimulationNodeDatum, EdgeDatum-randomSource生成随机数的函数() number-源码层面的补充说明G6 的类型定义位于 packages/g6/src/layouts/types.ts其中D3ForceLayout接口组合了BaseLayoutOptions与antv/layout导出的D3ForceLayoutOptions。同时 G6 在运行时还会自动注入一些布局参数见 packages/g6/src/runtime/layout.tsLayoutController.initGraphLayout会以画布尺寸计算center [width / 2, height / 2]并对d3-force/d3-force-3d特殊处理将 center 补全为{ x: width / 2, y: height / 2, z: 0 }形式——这也是为什么在 G6 中通常不需要手动指定centerX/centerY。另外G6 还提供两个通用布局选项见 packages/g6/src/layouts/types.tsanimation开启布局动画迭代布局会在两次迭代之间做动画过渡enableWorker是否在 WebWorker 中运行布局配合iterations控制迭代布局的迭代次数迭代控制参数属性说明类型默认值必填alpha当前收敛阈值控制活跃程度number1alphaMin停止的最小阈值alpha 小于该值即停止number0.001alphaDecayalpha 的衰减率取值范围 [0, 1]0.028 约等于 300 次迭代number0.028alphaTarget目标 alpha系统尝试收敛到该值number0velocityDecay速度衰减系数越大运动越慢number0.4力模型参数Link Forcelink连线力属性说明类型默认值必填link.id生成边 id 的函数(edge, index, edges) string(e) e.idlink.distance理想边长度number | ((edge, index, edges) number)30link.strength力强度越大越接近理想长度number | ((edge, index, edges) number)1link.iterations连线力迭代次数number1Many-Body ForcemanyBody多体力属性说明类型默认值必填manyBody.strength力强度负值排斥、正值吸引number | ((node, index, nodes) number)-30manyBody.thetaBarnes-Hut 精度越小越精确number0.9manyBody.distanceMin最小距离防止力过大number1manyBody.distanceMax最大距离超过该距离不施加力numberInfinityCenter Forcecenter中心力属性说明类型默认值必填center.x中心 x 坐标number-center.y中心 y 坐标number-center.strength力强度越大越靠近中心number-注在 5.1 版本中centerX/centerY是推荐的快捷字段。如果直接配置center力则遵循原生d3-force风格。Collision Forcecollide碰撞力属性说明类型默认值必填collide.radius碰撞半径节点过近则弹开number | ((node, index, nodes) number)10collide.strength力强度越大排斥越强number1collide.iterations碰撞力迭代次数number1Radial Forceradial径向力属性说明类型默认值必填radial.strength力强度越大越靠近半径number | ((node, index, nodes) number)0.1radial.radius目标半径节点被吸引到圆上number | ((node, index, nodes) number)100radial.x中心 x 坐标number0radial.y中心 y 坐标number0X / Y 轴向力x / y属性说明类型默认值必填x.strengthx 方向力强度number | ((node, index, nodes) number)-x.x目标 x 坐标节点被吸引到此number | ((node, index, nodes) number)-y.strengthy 方向力强度number | ((node, index, nodes) number)-y.y目标 y 坐标节点被吸引到此number | ((node, index, nodes) number)-实战一防止节点重叠最简单也最常见的需求是让节点不互相遮挡。通过为每个节点指定碰撞半径即可实现{ layout: { type: d3-force, collide: { // 通过为每个节点指定碰撞半径来防止节点重叠 radius: (d) d.size / 2, }, }, }官方示例见 packages/site/examples/layout/force-directed/demo/prevent-overlap.js。此外G6 在运行时还会自动计算节点的实际尺寸参与碰撞检测——在 packages/g6/src/runtime/layout.ts 中当未显式配置nodeSize时会读取节点元素的实际size属性作为默认碰撞尺寸这意味着即使不写collide.radius布局也能基于真实节点大小工作。G6 的测试用例 packages/g6/tests/demos/layout-d3-force.ts 演示了典型组合使用nodeSize: (d) d.style.size * 2放大碰撞检测半径并设置collide.strength: 0.5再配合zoom-canvas、drag-canvas、drag-element、click-select等交互行为。实战二团队聚类布局这个示例展示如何利用力导向布局实现团队聚类——不同团队的节点自动聚集成簇。核心技巧是让同团队节点的连线距离更短、强度更强同时加大团队间的连线距离、降低强度。import { Graph } from antv/g6; const graph new Graph({ container: container, width: 500, height: 250, autoFit: view, data: { nodes: [ // Team A { id: A1, team: A, label: A1, size: 30 }, { id: A2, team: A, label: A2, size: 20 }, { id: A3, team: A, label: A3, size: 20 }, { id: A4, team: A, label: A4, size: 20 }, // Team B { id: B1, team: B, label: B1, size: 30 }, { id: B2, team: B, label: B2, size: 20 }, { id: B3, team: B, label: B3, size: 20 }, { id: B4, team: B, label: B4, size: 20 }, // Team C { id: C1, team: C, label: C1, size: 30 }, { id: C2, team: C, label: C2, size: 20 }, { id: C3, team: C, label: C3, size: 20 }, { id: C4, team: C, label: C4, size: 20 }, ], edges: [ // Team A internal connections { source: A1, target: A2 }, { source: A1, target: A3 }, { source: A1, target: A4 }, // Team B internal connections { source: B1, target: B2 }, { source: B1, target: B3 }, { source: B1, target: B4 }, // Team C internal connections { source: C1, target: C2 }, { source: C1, target: C3 }, { source: C1, target: C4 }, // Few connections between teams { source: A1, target: B1 }, { source: B1, target: C1 }, ], }, node: { style: { size: (d) d.size, fill: (d) { // Different colors for different teams const colors { A: #FF6B6B, B: #4ECDC4, C: #45B7D1, }; return colors[d.team]; }, labelText: (d) d.label, labelPlacement: center, labelFill: #fff, }, }, edge: { style: { stroke: #aaa, }, }, layout: { type: d3-force, // 配置连线力 - 同团队节点更近 link: { distance: (d) { // 同团队内距离更短 if (d.source.team d.target.team) return 50; // 团队之间距离更长 return 200; }, strength: (d) { // 同团队内连接更强 if (d.source.team d.target.team) return 0.7; // 团队之间连接更弱 return 0.1; }, }, // 配置多体力 - 控制节点间的斥力 manyBody: { strength: (d) { // 团队负责人节点以 1 结尾斥力更强 if (d.label.endsWith(1)) return -100; return -30; }, }, // 配置碰撞力 - 防止节点重叠 collide: { radius: 35, strength: 0.8, }, // 配置中心力 - 保持图形居中 center: { strength: 0.05, }, }, behaviors: [drag-element-force], }); graph.render();主要配置要点link.distance团队内更短、团队间更长是聚类效果的关键link.strength团队内更强、团队间更弱manyBody.strength控制节点间斥力负值排斥collide防止节点重叠center保持布局居中完整可运行代码见文档原示例仓库中还提供了更精简的为不同节点定制参数版本packages/site/examples/layout/force-directed/demo/functional-params.js其中link.distance依据边的源节点id返回 100 或 30link.strength依据源节点是否为中枢节点返回 0.7 或 0.1manyBody.strength依据节点是否为叶子节点返回 -50 或 -10——这些函数式参数正是实现差异化布局的核心手段。实战三拖拽交互与节点固定d3-force 布局最吸引人的特性之一是实时响应拖拽。G6 为此提供了专用的drag-element-force行为注意它与普通drag-element不同只能配合 d3-force 或 d3-force-3d 布局使用见 packages/g6/src/behaviors/drag-element-force.ts。拖拽过程中布局会实时重算拖拽开始onDragStart读取布局实例的simulation并调用alphaTarget(0.3).restart()提升活跃度同时通过setFixedPosition将拖拽节点固定drag-element-force.ts拖拽过程onDrag将位移增量传给布局节点位置实时更新其他节点跟随调整拖拽结束onDragEnd将alphaTarget归零默认解除固定让布局重新收敛若设置了fixed: true则节点保持拖拽后的位置drag-element-force.ts{ layout: { type: d3-force, link: { distance: 100, strength: 2 }, collide: { radius: 40 }, }, behaviors: [ { type: drag-element-force, fixed: true, // 拖拽结束后节点保持固定不再受布局算法影响 }, ], }完整示例见 packages/site/examples/layout/force-directed/demo/drag-fixed.js。DragElementForceOptions.fixed的语义拖拽结束后是否保持固定定义于 packages/g6/src/behaviors/drag-element-force.ts。布局运行原理LayoutController 与迭代执行在 G6 运行时中布局由 packages/g6/src/runtime/layout.ts 的LayoutController统一调度postLayout在绘制完成后执行布局管线支持以数组形式传入多个布局构成流水线每个阶段触发BEFORE_STAGE_LAYOUT/AFTER_STAGE_LAYOUT生命周期事件graphLayout是 d3-force 等迭代布局的执行入口开启动画时通过onTick回调逐帧更新元素位置实现平滑动画关闭动画时直接执行后调用layout.tick(iterations)返回终态位置layout.tsstopLayout会调用迭代布局的stop()并结束动画适合在销毁或切换布局时释放资源布局结果通过updateElementPosition写回数据模型并触发element.draw重绘保证节点坐标与布局结果一致对应地仓库中的单元测试 packages/g6/tests/unit/layouts/d3-force.spec.ts 通过创建layoutD3Forcedemo 图并做 SVG 快照比对验证了 d3-force 布局的渲染稳定性快照产物存放于packages/g6/__tests__/snapshots/layouts/目录下。参数调优建议总结目标建议手段防止节点重叠增大collide.radius或提供nodeSize函数精确匹配节点尺寸聚类/分组展示同组link.distance调小、link.strength调大组间相反图过于松散/紧凑调整manyBody.strength负值排斥绝对值越大越稀疏图偏离画布中心配置centerX/centerY或center.strength圆形布局效果使用radial.radiusradial.strength实时交互拖拽使用drag-element-force行为配合较小的迭代次数保证流畅度布局精度提升增大iterations或调低alphaDecay如 0.01延长收敛过程需要进一步探索时可查阅仓库中的相关资源官方示例集合packages/site/examples/layout/force-directed/含d3-force.js、prevent-overlap.js、collision.js、functional-params.js、drag-fixed.js、bubbles.js等多个 demoG6 布局类型定义packages/g6/src/layouts/types.ts布局运行时控制器packages/g6/src/runtime/layout.ts力导拖拽交互实现packages/g6/src/behaviors/drag-element-force.ts测试用例与快照packages/g6/tests/unit/layouts/d3-force.spec.ts 与 packages/g6/tests/snapshots/layouts/赞分享数据可视化前端图表库【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址https://gitcode.com/gh_mirrors/g6/G6点击查看免费下载相关推荐D3.js 力导向图布局d3-force使用教程D3.js 力导向图布局d3 force使用教程 1. 项目目录结构及介绍 D3 force 的源码仓库包含了以下几个主要目录和文件 src : 存放所有Vega Force Transform 完全指南用 d3-force 驱动的力导向布局Vega Force Transform 完全指南用 d3 force 驱动的力导向布局 导读 force 是 Vega 中用于计算 力导向布局force数据可视化D3.js力导向图布局d3-force深度解析D3.js力导向图布局d3 force深度解析 在开源的世界里有一个备受开发者青睐的工具—— d3 force https://github.com/d3/创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
