为D3

时间:2015-10-09 09:31:03

标签: javascript d3.js social-networking

我无法获得基于链接值函数的linkDistance和linkStrength来处理曲线链接,我应该如何以及在哪里指定这些参数?

我根据代码

的Curved Links示例制作了JSFiddle
.linkDistance(function(d) { return d.value; }) 

写在两个不同的地方(目前已注释掉,因为它在任何一个地方都不起作用)。我最好的猜测是,在指定force.links(链接)之后,它属于较低的位置。我想也许这不起作用,因为d指的是bilinks而不是链接,所以我把它改成了

.linkDistance(function(d) { return d[3]; }) 

其中d[3]是存储在bilinks中的link.value,但也不起作用。两个版本都返回NaN错误。

我希望实现这个改进是简单明了的,所以也许这只是一个我想念的简单而明显的事情。但是我没有尝试过,我在网上找到的任何内容都没有帮助我在几个小时内取得任何进展,所以希望那里的人知道发生了什么以及如何解决它。

1 个答案:

答案 0 :(得分:2)

对于 linkDistance linkStrength 函数,您将获得源节点和目标节点,因此根据这一点,您可以返回linkDistance值,在这种情况下我将返回目标节点的权重

var force = d3.layout.force()
    .linkDistance(function(d) { return d.target.weight; })
    .linkStrength(function(d) { console.log(d);return 2; })

在你的情况下你做了

    .linkDistance(function(d) { return d.value; }) 
//this is going to return undefined, as there is nothing like that

工作代码here

修改

由于您需要链接对象中的链接值,因此在创建链接时添加该值,如下所示:

var nodes = graph.nodes.slice(),
        links = [],
        bilinks = [];

    graph.links.forEach(function (link) {
        var s = nodes[link.source],
            t = nodes[link.target],
            i = {}, // intermediate node
            linkValue = link.value // for transfering value from the links to the bilinks
            ;
        nodes.push(i);
        links.push({
            source: s,
            target: i,
            linkValue: linkValue //add the link value
        }, {
            source: i,
            target: t,
            linkValue: linkValue//add the link value
        });
        bilinks.push([s, i, t, linkValue]);
    });

所以现在在 linkdistance / linkStrength 函数中你可以得到值

 var force = d3.layout.force()
        .linkDistance(function (d) {
        return d.linkValue;
    })
        .linkStrength(function (d) {
        console.log(d.linkValue);
        return d.linkValue;
    })

工作代码here

希望这有帮助!