d3以可预测的顺序强制布局节点

时间:2015-07-06 21:56:39

标签: javascript d3.js force-layout

每当您刷新this example时,节点的顺序都不同。 你怎么能这样做,以便每次刷新时顺序相同?也许"子节点1"在顶部,然后与右边相邻的是"子节点2"等,一直到处。除此之外,这个例子适用于我需要实现的目标。

以下解决方案似乎需要将节点固定为x,y点。但这样做似乎消除了拖动功能(节点需要能够拖到不同的位置来改变顺序)。另外,我并不总是知道最初会有多少个节点。

https://groups.google.com/forum/#!topic/d3-js/NsHlubbv3pc

Calm down initial tick of a force layout

Configure fixed-layout static graph in d3.js

虽然需要拖动,但动画却不是。我试过看看停止动画是否有任何影响,但它没有。

var n = 50;

for (var i = 0; i < n; ++i) force.tick();

force.stop();

另外,尝试在数据中添加一个新属性,为每个孩子提供一个排序来以某种方式进行操作。并尝试分配排名和排序的ID。还尝试使用对象数组的索引号。没运气。谢谢你的任何想法。

2 个答案:

答案 0 :(得分:0)

Per Lars的评论,似乎在强制布局中这是不可能的。切换到树形布局。 JSFIDDLE仍然需要添加拖拽片。如果我能做到这一点,将会更新。

Links to jsfiddle.net must be accompanied by code.

答案 1 :(得分:0)

每次d3都不相同的原因是使用一个随机数来防止节点卡在奇数个位置。在我的有限理解中,随机数的作用是“抖动”图形,以帮助其解开纠缠。

一种使其可预测的简单解决方案是用seedrandom提供的可预测的随机数生成器替换随机数生成器。

如果在运行模拟之前使用相同的种子为随机数生成器提供种子,则每次的结果将相同。

请注意,仅对图形进行很小的更改将导致图形具有完全不同的布局。 (我总是想到蝴蝶混沌效应来解释原因)。