【问题标题】:How to remove existing nodes in d3.js如何删除 d3.js 中的现有节点
【发布时间】:2013-07-13 00:44:31
【问题描述】:


我已经访问过add and remove nodes in D3js,但它并没有解决我的问题。

第一次有一些节点,然后我想动态添加节点,如果节点已经存在,它会更新这些节点并且不要重复。

现在它正在复制而不是更新现有的。
这是主要代码和完整代码,工作小提琴是here

//handles node elements
var circles = svg.selectAll('g');


//update graph (called when needed)
function restart() {

/***************************************
    Draw circles (nodes)
****************************************/


circles = circles.data(data.nodes);

var g = circles.enter()
               .append("g")
               .attr("class", "gNode")
               .attr("cursor", "pointer")
               .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
               .call(force.drag);



g.append("circle")                      
.attr({
     "class": "node", 
     "cx": function(d) { return rScale(d.NumOccurrences); },
     "cy": function(d) { return rScale(d.NumOccurrences); },
     "r": function(d) { return rScale(d.NumOccurrences); }
 })             
 .style("fill", function(d, i) { return colors(i); })
 .style("stroke", "#000");



 g.append("text")
.attr({
    "x": function(d) { return rScale(d.NumOccurrences); },
    "y": function(d) { return rScale(d.NumOccurrences); },
    "font-family": "sans-serif",
    "font-size": "20px",
    "fill": "black",
    "text-anchor": "middle"
   })
   .text( function (d) { return d.name; });

   g.append("title")        
    .text(function(d) { return d.name; });

 // remove old nodes
 circles.exit().remove();

 // set the graph in motion
 force.start();
 }

// app starts here
restart();


 function dynamicAddNodes() {

var updatedata = {"name":"ios","NumOccurrences":"500","color":"green","x":0,"y":1}

data.nodes.push(updatedata);    

restart();
 }

 setInterval(dynamicAddNodes, 10000);

【问题讨论】:

    标签: javascript d3.js visualization data-visualization


    【解决方案1】:

    试试看:

    circles = circles.data(data.nodes,function (d) {
         return d.id;
       });
    

    节点的 ID 是唯一的。

    你可以看到:jsfiddle.net/MoHSenMHS/5r62N/

    【讨论】:

      【解决方案2】:

      您的问题不是更新节点过程,而是您将它们更新到的数据。

      restart() 运行时,它不会从数据中删除任何节点,它只是添加它们。由于数据永远不会被带走,因此节点永远不会被带走。每次调用该函数时,都会添加一个新的数据节点,并与该数据节点对应添加一个新的圆圈。

      我已更新您的示例 here 以显示此行为。每次更改数据时,我都会从您的数据中删除一个条目,并将其替换为新的数据点。

      【讨论】:

      • 感谢您的回复。让我解释一下我想要做什么。 想要更新现有节点的半径并添加新节点 1 这些是存储在数据库中的关键字。 2 第一次显示 20 个节点和半径大小,基于此关键字在数据库中存在的次数。 3 现在数据库中有新的关键字或添加了一些重复的关键字。 4 现在 10 秒后我调用数据库并检索关键字并想要更新现有节点的半径并添加新节点
      • 看看bl.ocks.org/mbostock/3808218。它展示了 d3 中的一般更新模式,接下来的两个示例展示了如何进行键控数据和转换。基本上,您要做的是指定数据进入、离开和更改时会发生什么。您需要一个定义这些行为的函数,然后在每次更新数据时调用该函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 2019-04-23
      • 2021-01-29
      • 2017-12-07
      • 1970-01-01
      • 2012-10-07
      相关资源
      最近更新 更多