Javascript 尝试多种方法使力定向图的节点大小与其度成比例

Javascript 尝试多种方法使力定向图的节点大小与其度成比例,javascript,d3.js,Javascript,D3.js,我有一个力定向图,效果很好。作为下一步,我将尝试使节点大小与其程度成比例 我试过多次,但都没有用 第一种方法: 我的数据存储在一个名为d3GraphData的变量中。我尝试在第一个节点上使用foreach函数,然后是链接。对于每个节点,我引入了新的属性inDegree和outDegree。在此之后,我迭代每个链接;对于每个d.source,我增加outDegree,对于每个d.target,我增加inDegree 这似乎不起作用,也没有计算出独立度和超越度。当我尝试在r属性中使用它们时

我有一个力定向图,效果很好。作为下一步,我将尝试使节点大小与其程度成比例

我试过多次,但都没有用

第一种方法:

我的数据存储在一个名为d3GraphData的变量中。我尝试在第一个节点上使用foreach函数,然后是链接。对于每个节点,我引入了新的属性inDegree和outDegree。在此之后,我迭代每个链接;对于每个d.source,我增加outDegree,对于每个d.target,我增加inDegree

这似乎不起作用,也没有计算出独立度和超越度。当我尝试在r属性中使用它们时

     node.attr("r",function(d) {return (d.inDegree+d.outDegree) * 2;});
我得到了预期的错误:

   Error: <circle> attribute r: Expected length, "NaN".
这似乎不会产生任何NaN错误,但节点似乎不像第一种方法那样出现,我只看到链接

也许我遗漏了一些明显的东西,但我真的很感激任何提示或意见


下面是我在第一种方法中使用的代码中发现的错误。您应该使用节点变量d3来选择节点,而不是使用节点变量数据数组来设置inDegree和outDegree值

  node.each(function(d) {
    d.inDegree = 0;
    d.outDegree = 0;
  });

  lines.each(function(d) {
    d.source.outDegree += 1;
    d.target.inDegree += 1;
  });

  node.attr("r", function(d) {
    var weight = d.inDegree ? d.inDegree : 0 + d.outDegree ? d.outDegree : 0;
    weight = weight > 25 ? 25 : (weight < 5 ? 5 : weight);
    return weight;
  });

这是更新后的fiddle

我怀疑D3V4是否具有节点的权重属性。因此,第二种方法不会像预期的那样起作用。
      node.attr("r", function(d) {return
d3.sum(d3GraphData.links.filter(function(p) {return p.source == d || p.target
== d}), function(p) {return p.weight})})
  node.each(function(d) {
    d.inDegree = 0;
    d.outDegree = 0;
  });

  lines.each(function(d) {
    d.source.outDegree += 1;
    d.target.inDegree += 1;
  });

  node.attr("r", function(d) {
    var weight = d.inDegree ? d.inDegree : 0 + d.outDegree ? d.outDegree : 0;
    weight = weight > 25 ? 25 : (weight < 5 ? 5 : weight);
    return weight;
  });