如何根据 links 和节点数自定义 d3 link 强度? (d3 v4)

How do you customize the d3 link strength as a function of the links and nodes counts ? (d3 v4)

我正在尝试编写自己的函数来权衡 d3 v4 力定向图的链接。

给出了默认的强度函数 here and according to the readme 可以通过将新函数作为参数传递来更改它。 (注意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]); }

没有成功。

很难从您提供的示例中分辨出来,但您需要将 link 是什么传递给模拟 forceLink 函数。如果您的示例实际上成功构建了 links,您可能会考虑将计算外部化,然后从 links 内部调用该函数:这是一个适用于我的示例。

 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);

我在 link 重量上使用了一个秤 weightScale,它在 .strenght 中被调用。 您可以像这样传递 links:

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

或者这个:

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