javascript - JS-如何删除重复的 JSON 节点并为所有合并的节点添加一个链接

标签 javascript json d3.js graph visualization

在此处输入代码 我有一个 JSON 文件,我想从中创建一个 d3 定向 箭头指向影响力得分较高的图表

{"nodes":[{"Name":"GJA","influenceScore":81.0,"type":10.0},
{"Name":"JJZ","influenceScore":82.6,"type":30.0},
{"Name":"SAG","influenceScore":89.0,"type":30.0},
{"Name":"JJZ","influenceScore":82.6,"type":30.0}],"links":
[{"source":0,"target":0,"type":"SA","value":1},
{"source":0,"target":1,"type":"SA","value":1},
{"source":0,"target":2,"type":"SA","value":1},
{"source":0,"target":3,"type":"SA","value":1}]}

我是d3新手,所以想在这里得到专家的帮助 我的 d3 代码在这里:

.link {
 stroke: #ccc;
 }

.node text {
 pointer-events: none;
 font: 12px sans-serif;
 }

</style>


<body>
<script src="//d3js.org/d3.v3.min.js"></script>
<script>
var width = 1200,
    height = 900;

var color = d3.scale.category10();
var fill = d3.scale.category10();
var svg = d3.select("body").append("svg")
   .attr("width", width)
   .attr("height", height);

var force = d3.layout.force()
   .gravity(0.052)
   .distance(350)
   .charge(-20)
   .size([width, height]);

d3.json("\\abc.json", function(error, json) {
 if (error) throw error;

 force
  .nodes(json.nodes)
  .links(json.links)
  .start();

var link = svg.selectAll(".link")
   .data(json.links)
   .enter().append("line")
   .attr("class", "link").style("stroke-width", function(d) { return 
    Math.sqrt(d.value); }).style("stroke", function(d) {return 
    fill(d.value);});

var node = svg.selectAll(".node")
  .data(json.nodes)
 .enter().append("g")
  .attr("class", "node")
  .call(force.drag);

  node.append("circle")
  .attr("class", "node")
  .attr("r", function(d) { return (d.influenceScore/10) + 10; 
  }).style("fill", function(d) { return color(d.type); });

  node.append("text")
  .attr("dx", -35)
  .attr("dy", "4.5em").text(function(d) { return d.Name });


  node.append("title").text(function(d) { return d.Name ;});


 force.on("tick", function() {
  link.attr("x1", function(d) { return d.source.x; })
    .attr("y1", function(d) { return d.source.y; })
    .attr("x2", function(d) { return d.target.x; })
    .attr("y2", function(d) { return d.target.y; });

node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + 
 ")"; });
   });
  });

我得到以下图像 enter image description here

我希望这里的目标节点例如 JJZ 只发生一次(目前它发生的次数与它在 JSON 中重复的次数一样多,即在给定的示例中是 2 次)但是连接两个节点的线应该增加厚度取决于节点重复的次数。所以连接 JJZ 和 GJA 的蓝线应该比 GJA 和 SAG 粗,如果另一个节点出现 5 次,它应该比 JJZ 和 GJA 粗。另外,我如何在更高影响力分数的方向上插入定向箭头

最佳答案

您的问题与 D3 无关:您可以使用纯 JavaScript 操作数组。

此函数根据属性 Name 查找 json.nodes 上的对象。如果它不存在,它会将对象推送到我命名为 filtered 的数组中。如果它已经存在,它会增加该对象中 count 的值:

var filtered = []

json.nodes.forEach(function(d) {
  if (!this[d.Name]) {
    d.count = 0;
    this[d.Name] = d;
    filtered.push(this[d.Name])
  }
  this[d.Name].count += 1
}, Object.create(null))

这是演示:

var json = {"nodes":[{"Name":"GJA","influenceScore":81.0,"type":10.0},
{"Name":"JJZ","influenceScore":82.6,"type":30.0},
{"Name":"SAG","influenceScore":89.0,"type":30.0},
{"Name":"JJZ","influenceScore":82.6,"type":30.0}],"links":
[{"source":0,"target":0,"type":"SA","value":1},
{"source":0,"target":1,"type":"SA","value":1},
{"source":0,"target":2,"type":"SA","value":1},
{"source":0,"target":3,"type":"SA","value":1}]};

var filtered = []

json.nodes.forEach(function(d){
	if(!this[d.Name]){
  	d.count = 0;
  	this[d.Name] = d;
    filtered.push(this[d.Name])
  }
  this[d.Name].count += 1
}, Object.create(null))

console.log(filtered)

然后,您只需要使用属性 count 来设置链接的 stroke-width

关于javascript - JS-如何删除重复的 JSON 节点并为所有合并的节点添加一个链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46358793/

相关文章:

javascript - d3.js 在 Jupyter Notebook 中加载版本 3 与版本 4

javascript - dc.js 根据第一个图表中的标准向多个图表中的数据点添加类

Javascript 不适用于加载的内容

database - node.js 存储数据的一些问题

javascript - 以平面结构从 JSON 中获取每个名称值

android - org.apache.http.conn.HttpHostConnectException :Connection to http://172. 20.38.143 拒绝

javascript - Uncaught ReferenceError : $ is not defined in HTML

javascript - Ionic Framework - 尝试推送页面时未定义 'nav'

javascript - 谷歌地图正在创建多个矩形而不是仅一个

javascript - 从 json 数组文件中检索键(动态)并将其用于 d3js 函数