当我用新节点更新图形时,我希望力布局中的旧节点保持其位置/动量/固定性。
更新添加和删除节点和链接,但服务器仅发送{name: _}
,但不知道其余内容,即{x: _, y: _, px: _, py: _, fixed: _}
。
现在,我手动合并每个:
var names = {};
// stores old nodes, indexed by _.name
function merge(nodes) {
for (var i=0; i < nodes.length; i++) {
var next = nodes[i];
var prev = names[nodes[i].name]; // defaults to null
var node = $.extend(true, {}, next, prev); // merge old into new
nodes[i] = node;
names[node.name] = node;
}
return nodes;
}
d3.json(function(error, graph){
merge(graph.nodes)
force.nodes(graph.nodes);
...
}
有更好的方法吗?也许某些d3函数接受两个数据(即旧的和新的)并输出一个(用作新的),这是由数据连接调用的? selection.data()
仅需key
。
此example替换节点,而不是合并它们。
相关:Problems adding and removing nodes in a force-layout using d3.js
答案 0 :(得分:1)
D3没有提供任何功能来执行您正在寻找的内容,但您已经实现了merge
,它执行相同的操作。基本上,您需要修改您为force.links()
和force.nodes()
提供的数据结构。在进行更改后,无需告诉强制布局明确使用它们。