如何根据链接和节点计数自定义d3链接强度? (d3 v4)

时间:2016-09-07 21:30:37

标签: d3.js graph hyperlink force-layout

我正在尝试编写自己的函数来衡量d3 v4强制有向图的链接。

默认强度函数为here,根据readme,可以通过传递新函数作为参数来更改它。 (请注意,自述文件中的函数与实际代码中的函数略有不同。)

这是我想要工作的代码的一部分:

 var simulation = d3.forceSimulation()
            .force("link", d3.forceLink()
                    .distance(60)
                    .id(function (d) { return d.name;})
                    .strength( function (link) {/* my code here */}))

我尝试用默认值替换评论:

function (link) { return 1 / Math.min(count[link.source.index],
                                      count[link.target.index]); }

没有成功。

1 个答案:

答案 0 :(得分:0)

很难从您提供的示例中看出,但您需要将哪些链接传递给模拟forceLink函数。如果您的示例实际上成功构建链接,您可以考虑外部化计算,然后从内部链接调用该函数:这是一个适合我的示例。

 var weightScale = d3.scaleLinear()
.domain(d3.extent(edges, function (d) { return d.weight }))
.range([.1, 1])


graph = d3.forceSimulation()
.nodes(nodes)
.force("charge", d3.forceManyBody()
  .strength(-75)  // -1000
  .distanceMax([250]))    
.force("link", d3.forceLink()
    .links(edges)
    .id(function(d) { return d.index })
    .strength (function (d) {return weightScale(d.weight)})
    .distance(55))
.force("center", d3.forceCenter(250, 250)) //  width / 2, height / 2
.on("tick", forceTick);

我在链接权重上使用了一个比例weightScale,在.strenght内调用。 您可以传递这样的链接:

.force("link", d3.forceLink(*YOURLINKS*)

或者这个:

.force("link", d3.forceLink()
  .links(*YOURLINKS*)