从显示其关系的csv文件中获取已连接节点的数量

时间:2016-04-14 16:01:32

标签: javascript html csv d3.js

我有一个大csv个文件,格式为:

ServerID|AppID
   01   |  01
   01   |  02
   02   |  02
   02   |  03
   02   |  04
   03   |  04

我在d3强制布局中使用此数据,如plunker所示。获取服务器和应用程序之间关系的代码的关键位置(I.E.应用程序在哪些服务器上):

links.forEach(function (link) {
    link.ApplicationName= nodeByName(link.ApplicationName, "A");
    link.Servername = nodeByName(link.Servername, "S");

    edges.push({ source: link.ApplicationName, target: link.Servername })
});

function nodeByName(name, SorA) {
    var groupNo = 0;
    switch (SorA) {
        case "A":
            groupNo = 1;
            break;
        case "S":
            groupNo = 2;
            break;
        default:
        groupNo = 0;
    }
    return nodesByNames[name] || (nodesByNames[name] = { Name: name, group: groupNo });
}

生成用于创建节点的服务器和应用程序的唯一列表,以及具有服务器和应用程序之间关系的单独列表(edges),用于创建链接节点的行。

我希望能够根据服务器节点上运行的应用程序数量来设置服务器节点的半径。我正在努力想出一种优雅的方法来获取并将这些信息存储在当前系统中。 d3中是否有任何可以帮助的内容,或者有人可以根据当前代码看到这样做的方法吗?

1 个答案:

答案 0 :(得分:1)

更新了plnkr:http://plnkr.co/edit/gtAcJinltdjkgu1MEPmY?p=preview

var circles = node.append("circle")
  .each(function(d) {
    d.amountOfNeighbours = 0;
    link.each(function(e) {
      console.log(e)
      if (e.source.Name == d.Name) { //if the source of the link is this node, amountOfNeighbours++
        d.amountOfNeighbours++
      }
      if (e.target.Name == d.Name) { //if the target of the link is this node, amountOfNeighbours++
        d.amountOfNeighbours++
      }
    })
  })
  .attr("r", function(d) {
    return d.amountOfNeighbours * 2;
  })

基本上浏览所有链接并查看所选节点的链接数量,如下所示:

.each(function(d) {
  d.amountOfNeighbours = 0; //set an attribute
  link.each(function(e) {
    console.log(e)
    if (e.source.Name == d.Name) { //if the source of the link is this node, amountOfNeighbours++
      d.amountOfNeighbours++
    }
    if (e.target.Name == d.Name) { //if the target of the link is this node, amountOfNeighbours++
      d.amountOfNeighbours++
    }
  })
})

然后使用此值:d.amountOfNeighbours作为半径。我把它乘以2,因为它的值非常小:)

 .attr("r", function(d) {
   return d.amountOfNeighbours * 2;
 })

希望有所帮助