力与布局
graph.forceMap
object
内置 map 对象用于记录所有作用力(包含内置力与自定义力),与 simulation 中的力保持同步。
作用力集合 forceMap 内置的作用力:
graph.forceMap = {
forceCenter: null, // 向心力
forceCollide: null, // 碰撞力
forceLink: null, // 线牵引力
forceManyBody: null, // 电荷力
forceX: null, // 定位力x
forceY: null, // 定位力y
forceRadial: null, // 环形力
forceRect: null, // 矩形力
forceCluster: null, // 聚簇力
}作用力常量 Forces:
export const Forces = {
forceCenter: d3.forceCenter, // 向心力
forceCollide: d3.forceCollide, // 碰撞力
forceLink: d3.forceLink, // 线牵引力
forceManyBody: d3.forceManyBody, // 电荷力
forceX: d3.forceX, // 定位力x
forceY: d3.forceY, // 定位力y
forceRadial: d3.forceRadial, // 环形力
forceRect, // 矩形力
forceCluster, // 聚簇力
}
// 在代码中使用
import ForceGraphVis, { Forces } from '@snfe/force-graph-vis'
// 初始化图
const graph = new ForceGraphVis({ /*...*/ })
// 设置作用力
graph.setForceOption({
forceCenter: Forces.forceCenter(0, 0),// 设置向心力
forceCustom: xxx // 设置用户自定义力
})graph.changeLayout(type = 'force', options={})
Function
切换布局,目前支持 6 种内置的布局类型,每种布局类型都对应一组作用力,切换布局时同步到作用力集合 forceMap 中
参数
-
type:force | ring | layer | rect | cluster | radialoptional布局类型 ,默认为
force力导向布局 -
options:objectoptional布局配置项,不同布局类型的配置项如下:
-
force力导向布局(动态) 该布局无配置项 -
radial放射布局(动态) 该布局无配置项 -
rect网格布局(动态)-
columnN:numberrequired 布局列数,必填 -
rowN:numberrequired 布局行数,必填 -
width:numberoptional 布局宽度,默认为画布的宽度 -
height:numberoptional 布局高度,默认为画布的高度 -
x:obejectoptional 布局水平偏移,默认为 0 -
y:numberoptional 布局垂直偏移,默认为 0 -
xCenter:obejectoptional 网格水平中心,默认为 0.5 -
yCenter:numberoptional 网格垂直中心,默认为 0.5
-
-
cluster聚簇布局(动态)-
clusterCenter:stringrequired在节点数据配置中增加
clusterCenter配置项,指向聚簇中心节点的 ID{ "nodes": [{ "id": "a", // 节点id "name": "节点A", // 节点文字 },{ "id": "b", // 节点id "name": "节点B", // 节点文字 "clusterCenter": 'a', // 聚簇中心指向节点a }] }
-
-
ring环形层级布局(静态)-
root:stringrequired 根节点 ID,必填 -
width:numberoptional 布局宽度,默认为画布的宽度 -
height:numberoptional 布局高度,默认为画布的高度 -
radius:numberoptional 环形层级半径,默认为画布高度或宽度一半的最小值 -
top:numberoptional 布局上边距,默认为 30 -
bottom:numberoptional 布局下边距,默认为 30 -
left:numberoptional 布局左边距,默认为 30 -
right:numberoptional 布局右边距,默认为 30 -
expandFirst:'next' | 'prev'optional 优先展开根节点的 下层级 / 上层级 -
nextFarFirst = false:booleanoptional 节点优先在远的一侧
-
-
layer层级布局 (静态)-
root:string | Array<string>required 根节点 id,通常情况下是 string 类型,支持多个根节点以数组形式传入 -
expandFirst = 'next':'next' | 'prev'optional 优先展开根节点的 下层级 / 上层级,默认下层级 -
width:numberoptional 布局宽度,默认为画布的宽度 -
height:numberoptional 布局高度,默认为画布的高度 -
levelGap:numberoptional 布局层级间距,350 -
nodeGap:numberoptional 布局节点间距,默认为 2 -
padding:obejectoptional 布局边距,默认为{ top: 30, bottom: 30, left: 30, right: 30 } -
maxLevel = Infinity:numberoptional 最大层数,默认无限制 -
initDuration:numberoptional 初始动画持续时间,默认为 1500
-
-
所有布局类型共有配置项
-
forceUseType:merge | coveroptional设置作用力时的行为类型,详细参数参考下方
graph.setForceOption方法中的forceUseType参数plainplainplainplainplainplainplainplainplainplainplainplainplainplainplainplainplainplainplainplainplainplainplainplainplain -
force:objectoptional作用力参数,修改布局时默认使用的作用力,用于调整内置布局的行为,详细参数参考下方
graph.setForceOption方法中的forceOption参数plainplainplainplainplainplainplainplainplainplainplainplainplainplainplain
-
-
graph.setForceOption(forceOption = {}, forceUseType = 'merge')
设置作用力,可以接收对象类型/函数类型的参数,具有合并/覆盖当前作用力集合的两种行为
参数
-
forceUseType:merge | coveroptional设置作用力时的行为类型,默认为合并模式,
merge: 与当前作用力集合forceMap合并,cover: 覆盖当前作用力集合forceMap -
forceOption:object | Functionoptional作用力参数
当传入
object类型时,如果要修改内置作用力,应与forceMap中的 key 保持一致,支持添加用户自定义力forceOption = { forceCenter: null, // 向心力 forceCollide: null, // 碰撞力 forceLink: null, // 线牵引力 forceManyBody: null, // 电荷力 forceX: null, // 定位力x forceY: null, // 定位力y forceRadial: null, // 环形力 forceRect: null, // 矩形力 forceCluster: null, // 聚簇力 xxx: null // 用户自定义力 }当传入
function类型时,forceOption将作为回调函数被执行forceOption = (forceMap, graph) => { return { forceCenter: null, // 向心力 forceCollide: null, // 碰撞力 forceLink: null, // 线牵引力 forceManyBody: null, // 电荷力 forceX: null, // 定位力x forceY: null, // 定位力y forceRadial: null, // 环形力 forceRect: null, // 矩形力 forceCluster: null, // 聚簇力 xxx: null // 用户自定义力 } }回调函数参数
-
forceMap:object当
forceUseType = 'merge'时,该参数为图谱实例的作用力集合,当forceUseType = 'cover'时,该参数为空对象 graph当前图谱实例
回调函数返回值
-
newForceMap:objectrequired当
forceUseType = 'cover'时,回调函数必须返回一个对象,作为新的作用力集合
-
graph.updateForce(key, fn)
通过 key 修改单个力,只允许修改作用力集合 forceMap 中已经存在的力
参数
-
key:stringrequired作用力名称
-
fn:functionrequired传入回调函数来修改作用力
回调函数参数
-
force:function根据
key获取到的作用力函数
回调函数返回值
-
newForce:functionrequired返回修改之后的作用力函数
-
graph.setForce(key, value)
通过 key 设置单个力,覆盖作用力集合中对应的力,允许设置用户自定义力
参数
-
key:stringrequired作用力名称
-
value:functionrequired作用力函数
graph.clearForces()
清除所有力,适用于无力学模拟下的静态布局,自定义布局的场景
graph.updateForces()
内部调用方法,基于 forceMap 更新 simulation 中的所有作用力,正常情况下无需调用,除非用户手动修改作用力集合(强烈不建议)