Javascript 如何更新d3.js中的绑定数据?

Javascript 如何更新d3.js中的绑定数据?,javascript,d3.js,Javascript,D3.js,我想在D3.js中动态更新网络图。 现在我的代码是: var color = d3.scale.category20(); var my_nodes = [{"cluster": 0, "x": 50, "y": 50}, {"cluster": 0, "x": 100, "y": 50}, {"cluster": 1, "x": 100, "y":100}]; var vis = d3.select("body").append

我想在D3.js中动态更新网络图。 现在我的代码是:

var color = d3.scale.category20();
var my_nodes = [{"cluster": 0, "x": 50,  "y": 50},
                {"cluster": 0, "x": 100, "y": 50},
                {"cluster": 1, "x": 100, "y":100}];
var vis = d3.select("body").append("svg").attr("width", 500).attr("height", 500);
var nodes = vis.selectAll("circle.node").data(my_nodes).enter().append("g")
               .attr("class", "node");
var circles = nodes.append("svg:circle")
                   .attr("cx", function(d) { return d.x; })
                   .attr("cy", function(d) { return d.y; })
                   .attr("r", 5)
                   .style("fill", function(d) {return color(d.cluster)});
这个代码有效。 但当我更新数据时,如:

var new_nodes = [{"cluster": 0, "x": 50,  "y": 50},
                 {"cluster": 2, "x": 100, "y": 50},
                 {"cluster": 2, "x": 100, "y":100}];
nodes.data(new_nodes);
不起作用

如何更新绑定数据

编辑:我想做的是用新数据替换旧数据
my_节点
。是否有任何方法可以更新每个绑定数据的属性
集群

编辑2:假设我这样做:

d3.select(“body”).select(“svg”).selectAll(“circle”).data(mydata.enter().append(“svg:circle”)


我可以修改我的数据吗?

我不知道你希望它看起来怎么样,但我在这里创建了一个小提琴:

单击
update
按钮将更新到新数据

我已经根据和进行了更改

我在每个圆的
fill
属性上添加了一个转换,因此希望您能看到在这种情况下节点正在更新,而不是添加新节点。我还展示了添加的第四个新节点,以演示其区别

最后,通过删除
节点
g
)元素并使用
圆圈
,我简化了一些事情。这是重要的代码:

// DATA JOIN
// Join new data with old elements, if any.
var circle = vis.selectAll("circle").data(data);

// ENTER
// Create new elements as needed.
circle.enter().append("svg:circle").attr("r", 5);

// UPDATE
// Update old elements as needed.
circle.attr("cx", function (d) {return d.x;})
    .attr("cy", function (d) {return d.y;})
    .transition().duration(750)
    .style("fill", function (d) {
    return color(d.cluster)
});
// EXIT
// Remove old elements as needed.
circle.exit().remove();

更新数据时,
force.start()
每次都会运行,因此看起来像是新数据。如果删除该选项,则更容易看到正在发生的情况,但会丢失动画。您可能只想为新节点(也可能是退出节点)的条目设置动画,但这将是一个单独的问题

没有数据绑定魔法会触发“重画”。只需调用
.data
,然后重新设置属性:

function update(){
 nodes
  .attr("cx", function(d) {
    return d.x;
  })
  .attr("cy", function(d) {
    return d.y;
  })
  .attr("r", 5)
  .style("fill", function(d) {
    return color(d.cluster)
  });
}

var nodes = vis.selectAll("circle.node").data(my_nodes)
  .enter()
  .append("g")
  .attr("class", "node")
  .append("svg:circle");
update();

// some time later

nodes.data(new_nodes);
update();

示例。

请参阅。谢谢您的回答。我想做的是将旧数据
my_节点
替换为新数据
new_节点
。对不起,我没有解释。我正在寻找如何在不使用
exit()
remove()
的情况下更新有界数据,例如,在我的例子中,我想更新属性
\uuuuuuu data\uuuuuu.cluster
,但根据您的回答,似乎没有方法可以做到这一点。谢谢,谢谢。其中一个问题是您指出的“重画”问题,另一个问题是“子节点继承父数据。但如果父数据更新,子数据不会自动更新”。因此,我想做的是: