Graph 使用CSV属性设置链接长度、节点大小d3

Graph 使用CSV属性设置链接长度、节点大小d3,graph,d3.js,directed-graph,Graph,D3.js,Directed Graph,以下是mbostock给出的使用csv创建力图的示例: 我正在用D3创建一个力图,但不确定如何/在何处调用CSV行中的值来设置节点大小、颜色或链接长度 我尝试了一些方法,例如: links.forEach(function(link) { link.source = nodeByName(link.user1); link.target = nodeByName(link.user2); link.size = nodeByName(link.somevaluefro

以下是mbostock给出的使用csv创建力图的示例:

我正在用D3创建一个力图,但不确定如何/在何处调用CSV行中的值来设置节点大小、颜色或链接长度

我尝试了一些方法,例如:

links.forEach(function(link) {
    link.source = nodeByName(link.user1);
    link.target = nodeByName(link.user2);
    link.size = nodeByName(link.somevaluefromcsv)
    link.distance = nodeByName(link.somevaluefromcsv);
  });
这是错误的。据我所知,它只会生成空节点,并且这些值不能在其他地方调用

var node = svg.selectAll(".node")
      .data(nodes)
    .enter().append("circle")
      .attr("class", "node")
      .attr("r", function(d) {return d[3];}) //this is not returing any value as far as I can tell.
      .call(force.drag);
或在勾号功能中进一步向下:

node.attr("cx", function(d) { return d.x; })
        .attr("cy", function(d) { return d.y; })
        .attr("r", function(d) {return d[7];});
可能有一些因素会导致问题: 1.我似乎没有一个好的links函数或nodesbyName数组或函数的概念模型

CSV中的典型行(现在是这样),顺序如下: 时间,用户1,用户2,相似性分数,总分,反对分数,反对分数,长度分数 它们是:

函数
nodeByName(name)
-创建新节点或返回名称指定为参数的现有节点。 如果需要从链接传递节点属性,可以在
forEach

links.forEach(function(link) {
    link.source = nodeByName(link.user1);
    link.target = nodeByName(link.user2);
    link.source.radius = link.radius
    link.size = link.somevaluefromcsv;
    link.distance = link.somevaluefromcsv;
});
链接-节点之间的链接数组

var node = svg.selectAll(".node")
      .data(nodes)
    .enter().append("circle")
      .attr("class", "node")
      .attr("r", function(d) {return d.radius;}) // radius property of node
      .call(force.drag);

为什么d[7]?你的csv文件是什么样的?谢谢Ivan-我添加了一个示例。我可能需要一天左右的时间来检查您的建议。如果您的csv没有名称行,您必须在任何地方使用索引:将
链接替换为
链接。user1
替换为
链接[2]
var node = svg.selectAll(".node")
      .data(nodes)
    .enter().append("circle")
      .attr("class", "node")
      .attr("r", function(d) {return d.radius;}) // radius property of node
      .call(force.drag);