Force-directed graph layout using velocity Verlet integration.(v4)
d3.forceSimulation - 创建一个新的simulation.
使用指定的节点数组创建一个新的simulation。如果没有指定节点,则默认为空数组。simulation.restart - 重新启动模拟的内部计时器。
该方法可用于在交互过程中对仿真进行“再加热”,如在拖拽节点时,或在与仿真暂停后恢复仿真。simulation.stop - 停止模拟的计时器
停止模拟的内部计时器,如果它正在运行,并返回模拟。如果计时器已经停止,则此方法不执行任何操作。该方法适用于人工运行仿真。simulation.tick - 一个持续性刷新的function。
手动按指定的迭代次数对模拟进行步骤,并返回模拟。如果没有指定迭代,则默认为1(单步)。simulation.nodes - set the simulation’s nodes.
如果节点nodes 被指定,设置布局的相关节点为指定的nodes 数组。如果未指定节点nodes ,则返回当前数组,默认为空数组。每个节点具有以下属性:index - nodes 数组节点的索引(从零开始)。
x - 当前节点的x坐标位置。
y - 当前节点的位置y坐标。
vx -节点当前的x速度
vy -节点当前的y速度
fx -节点的固定x位置
fy -节点的固定y位置
simulation.alpha - 设置当前alpha值。
如果指定了alpha,则将当前alpha设置为范围[0,1]中指定的数值,并返回此模拟。如果没有指定alpha,则返回当前alpha值,默认值为1。simulation.alphaMin -设置最小alpha阈值。
如果指定了min,则将最小alpha设置为范围[0,1]中指定的数字,并返回此模拟。如果没有指定最小值,则返回当前的最小alpha值,默认值为0.001。当当前alpha值小于最小alpha值时,模拟的内部计时器停止。默认alpha衰减率~0.0228,对应300次迭代。simulation.alphaDecay - 设定指数衰减率。
如果指定衰减,将衰减率设置为范围[0,1]中的指定数字,并返回此模拟。如果没有指定衰减,返回当前衰减率,默认值为0.0228…= 1 - pow(0.001, 1 / 300),其中0.001是默认的最小衰减率。
衰减率决定了当前alpha向目标alpha内插的速度。较高的衰减率会使模拟更快地稳定下来,但有可能陷入局部最小值;数值越低,模拟运行的时间越长,但通常收敛于更好的布局。要使模拟永远以当前alpha值运行,请将衰减率设置为零;或者,设置一个大于最小值的目标。simulation.alphaTarget - 设置目标的alpha。
如果指定了目标,将当前目标alpha设置为范围[0,1]中的指定数字,并返回此模拟。如果未指定目标,则返回当前目标alpha值,默认值为0。simulation.velocityDecay - 设置速度衰减率。
如果指定衰减,则将速度衰减因子设置为[0,1]范围内的指定数值,并返回此模拟。如果未指定衰减,则返回当前速度衰减因子,默认值为0.4。simulation.force - 添加或删除一个力。
如果指定了力,则指定指定名称的力并返回此模拟。如果没有指定力,则返回未定义的力
例如,要创建一个新的模拟图布局,如下
var simulation = d3.forceSimulation(nodes)
.force("charge", d3.forceManyBody())
.force("link", d3.forceLink(links))
.force("center", d3.forceCenter());
若要删除具有给定名称的力,请传递null作为该力。例如,移除电荷力:
simulation.force("charge", null);
simulation.find(x, y[, radius]) - 找到离给定位置最近的节点。
如果没有指定半径,则默认为无穷大。如果搜索区域内没有节点,则返回undefined。simulation.on(typenames, [listener]) - 添加或删除事件侦听器。
如果指定了侦听器,则设置指定typenames的事件侦听器并返回此模拟。如果事件侦听器已经注册了相同的类型和名称,则在添加新侦听器之前将删除现有侦听器。如果侦听器为null,则删除指定的typenames的当前事件侦听器(如果有的话)。如果未指定侦听器,则返回与指定的输入名匹配的第一个当前分配的侦听器(如果有)
typenames是一个字符串,包含一个或多个由空格分隔的typename。force - apply the force.
force.initialize(nodes) - 初始化力 。
d3.forceCenter[x, y] - 创建中心力。
center.x - 设置中心x坐标(默认为0)。
center.y - 设置中心y坐标(默认为0)。
d3.forceCollide[radius] - 创建一个圆的碰撞力。默认所有节点的常数1
collide.radius - 设置圆半径。默认为1
collide.strength - 设置碰撞分辨率强度。 默认为0.7
collide.iterations - 设置迭代次数。
默认为1,增加迭代次数大大增加了约束的刚度,避免了节点的部分重叠,同时也增加了计算力的运行时成本。d3.forceLink - 创建链接力。默认为空数组
link.links - 取得或者设置节点间的链接数组。
每个链接都是一个具有以下属性的对象:source- 链接的源节点target- 链接的目标节点index- the zero-based index into links, assigned by this method基于零的索引到链接,由这种方法分配
-
link.id - 通过数字索引或字符串标识符连接节点。
如果指定了id,则将节点id访问器设置为指定的函数并返回此力。如果没有指定id,则默认为数值node.index:
以下两种写法都可以:
var nodes = [
{"id": "A"},
{"id": "B"},
{"id": "C"}
];
var links = [
{"source": 0, "target": 1}, // A → B
{"source": 1, "target": 2} // B → C
];
var nodes = [
{"id": "A"},
{"id": "B"},
{"id": "C"}
];
var links = [
{"source": "A", "target": "B"},
{"source": "B", "target": "C"}
];
link.distance - 设置连接距离。默认为30
link.strength - 设置连接强度 。默认为:1 / Math.min(count(link.source), count(link.target));
count(node)是一个函数,它返回作为源或目标的给定节点的链接数。之所以选择这个默认值,是因为它会自动降低连接到重连接节点的链接强度,从而提高稳定性。
对每个链接调用强度访问器,传递链接及其从零开始的索引。然后,生成的数字存储在内部,这样,只有在初始化力或使用新的强度调用此方法时,才会重新计算每个链接的强度,而不是在力的每个应用程序上。link.iterations - 设置迭代次数。默认值为1.
增加迭代次数会大大增加约束的刚度,对网格等复杂结构很有用,但也会增加计算力的运行时成本。d3.forceManyBody - 创建一个N体力
manyBody.strength - 设置力的强度。
正值使节点相互吸引,类似于重力;负值使节点相互排斥,类似于静电荷。如果没有指定强度,则返回当前强度访问器,其默认值为:-30manyBody.theta - set the Barnes–Hut approximation accuracy.
若指定了 theta, 将其设定为Barnes–Hut近似的判定参数. 若 theta 未指定, 返回当前值, 默认为 0.9。manyBody.distanceMin - 当节点接近限制力.默认值为1.
最小距离为两个相邻节点之间的力的强度建立了上限,避免了不稳定性。特别是当两个节点完全重合时,避免了无穷大的力;在这种情况下,力的方向是随机的。manyBody.distanceMax - 当节点远离限制力。默认为无限大。指定有限的最大距离可以提高性能,并产生更本地化的布局。
d3.forceX - 创建一个x方向的定位力。
创建一个新的定位力沿着x轴指向给定的位置x。如果没有指定x,则默认为0。x.strength - 设置力的强度。默认值为0.1.
x.x - 设置目标x坐标。默认值为0.
d3.forceY - 创建y方向的定位力。
创建一个新的定位力沿y轴向给定的位置y。如果没有指定y,它默认为0。y.strength - 设置力的强度。 默认值为0.1.
-
y.y - 设置目标y坐标。默认值为0.
image
image d3.forceRadial - 创建径向定位力。创建一个新的定位向指定半径的一个圆的力量集中在⟨x, y⟩。如果x和y是未指定,默认⟨0,0⟩
radial.strength - 设置力的强度set the force strength.
radial.radius - 设置目标半径set the target radius.
radial.x - 设置目标中心x坐标set the target center x-coordinate.
radial.y - 设置目标中心y坐标set the target center y-coordinate.
d3.layout 布局 (v3)
力布局
d3.layout.force - 使用物理模拟排放链接节点的位置。
force.alpha - 取得或者设置力布局的冷却参数。
获取或设置力布局的冷却参数:alpha。如果值value 已指定,设置alpha为指定的值并返回力布局。如果值大于零,这个方法也将重新启动力布局(如果它尚未运行),分发一个“启动”事件启用节拍定时器。如果值为非正,且力布局正在运行,这个方法将在下一个tick停止力布局并分派“结束”事件。如果未指定值,则该方法返回当前alpha值。force.chargeDistance - 取得或者设置最大电荷距离。
如果distance 被指定,设置电荷强度已经应用的最大距离。如果distance 未被指定,返回当前最大电荷距离,默认为无穷大。指定一个有限电荷距离提高力导向图的性能和产生更本地化的布局。限定距离的电荷力是尤其有用当合自定义重力一起使用时。有关示例, 请参阅“限定距离的电荷力(Constellations of Directors and their Stars)” (The New York Times).force.charge - 取得或者设置电荷强度。
如果指定电荷强度charge ,设置电荷强度为指定的值。如果电荷强度charge 未被指定,返回电流电荷强度,其默认值为-30。如果电荷强是常量,那么所有节点都具有相同的电荷。否则,如果电荷强度charge是一个函数,则该函数为每个节点(按顺序)求值,传递的参数是节点和它的索引,this上下文作为力布局;该函数的返回值被用于设置每个节点的电荷强度。每当布局开始(starts)时被调用。
负值导致节点排斥,而正值导致节点吸引。对于图形布局,应使用负值;对于N体模拟(n-body simulation),可以使用正值。所有节点都假定为无穷远的小点具有相等电荷和质量。电荷力是通过Barnes–Hut算法(Barnes–Hut algorithm)高效实现的,为每个tick计算四叉树。电荷力设置为零禁用四叉树(quadtree),它可以显着提高性能,如果你不需要N体模拟。 Barnes–Hut算法:http://arborjs.org/docs/barnes-hutforce.drag - 给节点绑定拖动行为。
绑定一个行为允许交互式拖动到节点,无论是使用鼠标或触摸。
实现注意:在鼠标移动和鼠标弹起事件监听器已注册当前窗口上,这样,当用户开始拖动节点,他们可以继续拖动节点,即使鼠标离开窗口。每个事件监听器使用“force”命名空间,以避免和其他你可能想绑定到节点或窗体上的事件监听器冲突。如果节点被拖动事件移除了,随后的点击事件将被抓获到的最后一个鼠标抬起事件触发,你可以忽略这些点击和拖动通过查看是否默认的行为被阻止了。
selection.on("click", function(d) {
if (d3.event.defaultPrevented) return; // ignore drag
otherwiseDoAwesomeThing();
});
force.friction - 取得或者设置摩擦系数。
如果指定了摩擦系数friction ,设定摩擦系数为指定的值。如果摩擦系数未被指定,返回当前系数,默认为0.9。force.gravity - 取得或者设置重力强度。
如果指定了重力gravity ,设置引力强度为指定的值。如果未指定重力,返回当前的引力强度,默认为0.1。force.linkDistance - 取得或者设置链接距离。
如果指定了distance ,设定链接节点间的目标距离为指定的值。如果未指定distance ,返回布局的当前链路距离,默认为20。force.linkStrength - 取得或者设置链接强度。
如果指定了strength ,设置链接间强度(刚性)为[0,1]范围内的指定的值。如果strength 未被指定,返回布局的当前链接强度,默认为1。force.links - 取得或者设置节点间的链接数组。
如果指定了链接links ,设置布局的相关链接为指定的links 数组。如果没有指定链接links 时,返回当前数组,默认为空数组。每个链接都有以下属性:source - 源节点(节点中的元素)。
target - 目标节点(节点中的元素)。
注意:在源和目标属性的值可初始化为nodes 数组的索引;这些将被替换为调用开始函数(start)之后的引用。链接对象可能有你指定的其他字段,这个数据可以用来计算链接强度strength和距离distance,基于每个连接的基础使用一个访问函数force.nodes - 取得或者设置布局的节点数组。
force.on - 监听在计算布局位置时的更新。
注册指定的监听器listener 为力布局指定类型的事件。目前,仅支持"start","tick"和"end"事件。"tick"事件将被指派为模拟的每个tick。当模拟内部的alpha冷却低于阈值(0.005)时,"end"事件就被调度并被设为零。force.resume - 重新加热冷却参数,并重启模拟。
相当于:
force.alpha(.1);
设置冷却参数alpha为0.1。force.size - 取得或者设置布局大小。
如果指定了size,设置可用的布局大小为指定的代表x和y的两元素数字数组来。如果未指定size,返回当前size,默认为[1, 1]。size影响力导向图的两个方面:重力中心和初始的随机位置。重心为[ x/2, y/2 ]。force.start - 当节点变化时启动或者重启模拟。
启动模拟;当首次创建布局时此方法必须被调用,然后分配节点和链接。此外,每当节点或链接发生变化它应当再次调用。force.stop - 立即停止模拟。
相当于:
force.alpha(0);
终止模拟,冷却参数alpha设定为零。这可以用来显式地停止模拟,例如,如果你要展示的动画或允许其他的互动。如果你没有明确停止布局,它仍然会自动在布局的冷却参数衰变后低于某个阈值后停止。force.theta - 取得或者设置电荷作用的精度。
若指定了 theta, 将其设定为Barnes–Hut近似的判定参数. 若 theta 未指定, 返回当前值, 默认为 0.8。force.tick - 运行布局模拟的一步。

