如何根据 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*)
我正在尝试编写自己的函数来权衡 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*)