Javascript d3.js在v4中设置属性

Javascript d3.js在v4中设置属性,javascript,d3.js,Javascript,D3.js,以下代码适用于D3v3,但不适用于v4: function render(data) { //bind var cirs = svg.selectAll('circle').data(data); //enter cirs.enter().append('circle').attr('r', 2); //update cirs.attr('cx', function(d) { return d.x }) .attr('cy', function(d)

以下代码适用于D3v3,但不适用于v4:

function render(data) {
  //bind
  var cirs = svg.selectAll('circle').data(data);

  //enter
  cirs.enter().append('circle').attr('r', 2);

  //update
  cirs.attr('cx', function(d) {
    return d.x
  })
  .attr('cy', function(d) {
    return d.y
  });

  //exit
  cirs.exit().remove();
}
我的数据:

var objects = [
  {x: 100, y:100},
  {x: 70, y: 90},
  {x: 181, y: 105},
  {x: 80, y: 60},
  {x: 160, y: 120},
  {x: 168, y: 182},
  {x: 95, y: 110}
]
render(objects);
我发现未设置
cx
cy

在版本4中有没有新的设置属性的方法?

v4的答案是:

此外,不再将进入的节点合并到更新选择中;用于在数据联接后组合输入和更新

因此,您的更新选择将为空,对
.attr()
的调用将永远不会执行,从而导致缺少属性值

要使代码正常工作,只需将以前输入的圆圈合并到更新选择中:

function render(data) {
  //bind
  var cirs = svg.selectAll('circle').data(data);

  //enter
  var enter = cirs.enter().append('circle').attr('r', 2);

  //update (including merged enter selection)
  var update = cirs.merge(enter); // Merge the enter selection into the update selection
  update.attr('cx', function(d) {
      return d.x
    })
    .attr('cy', function(d) {
      return d.y
    });

  //exit
  cirs.exit().remove();
}
var svg=d3.select('body').append('svg'))
.attr('宽度',250)
.attr('height',250);
函数渲染(数据){
//束缚
var cirs=svg.selectAll('circle').data(数据);
//进入
var enter=cirs.enter().append('circle').attr('r',2);
//更新(包括合并的输入选择)
var update=cirs.merge(enter);//将enter选择合并到更新选择中
update.attr('cx',函数(d){
返回d.x
})
.attr('cy',函数(d){
返回d.y
});
//出口
cirs.exit().remove();
}
变量对象=[{
x:100,
y:100
}, {
x:70,
y:90
}, {
x:181,
y:105
}, {
x:80,
y:60
}, {
x:160,
y:120
}, {
x:168,
y:182
}, {
x:95,
y:110
}];
渲染(对象)

您的问题缺少代码中的一些重要部分。我的第一个猜测是,您没有在更新选择中输入您的选择,因此不会执行对
attr()
的调用,因为更新选择是空的。就像我说的,这是一个粗略的猜测。要获得更深入的帮助,请提供更多的
render()
函数。@altocumulus这是完整的代码。