圆弧半径在d3转换时未更新

问题描述:

我在d3中遇到转换问题。这个jsfiddle说明了这个问题:http://jsfiddle.net/3bzsE/圆弧半径在d3转换时未更新

当页面加载时,使用dataset01为数组中的每个人创建一个圆。 d.name被用作密钥。

图表下面的蓝色矩形是更新点击数据的按钮。

这里是更新功能可按:

function updateVis(data) { 
    var points = svg.selectAll('.nameinfo') 
     .data(data, function(d) { return d.name;}); 

    var pointsEnter = points 
     .enter() 
     .append('g') 
     .attr('class', 'nameinfo'); 

    pointsEnter 
     .append('circle') 
     .attr('cx', function(d) { return 10 + d.position * 100; }) 
     .attr('cy', width/2) 
     .attr('r', 0) 
     .style('fill', function(d) { return z(d.position); }) 
     .style('fill-opacity', 0.5) 
     .style('stroke', '#232323') 
     .append("title") 
     .text(function(d) { return d.name; }); 


    pointsEnter 
     .append('text') 
     .attr('x', function(d) { return 10 + d.position * 100; }) 
     .attr('y', width/2) 
     .attr("dy", "0.35em") 
     .style("text-anchor", "middle") 
     .style("font-size", "11px") 
     .text(function(d, i) { return d.name; }); 

    pointsUpdate = points 
     .selectAll('circle') 
     .transition().duration(500) 
     .attr('r', function(d){ return d.value/2;}); 

    var pointsExit = points.exit().transition().duration(500).remove(); 

    pointsExit 
     .selectAll('circle') 
     .attr('r', 0); 
} 

的进入和退出的行为符合市场预期,但圆半径不改变对存在的进入和退出的数据集的名字。

使用值吉姆一个例子: 点击按钮三连扣一个活动:

  • 乔,珍妮特和朱莉退出
  • 简和约翰进入
  • 但是,吉姆的半径(它应该缩小,因为d.value从130变为50)

点击两个带有三个活动原因的Jim退出。点击两个中的三个,导致Jim从dataset03以正确的半径输入。

相同的行为可以看到与其他名称。在所有情况下进入和退出工作,但是如果两个数据集具有相同名称的元素,则在过渡时不会更新半径

您可能必须专门为过渡选择圆圈,而不是尝试在外侧执行组元素。因此,而不是这样的:

pointsUpdate = points 
    .selectAll('circle') 
    .transition().duration(500) 
    .attr('r', function(d){ return d.value/2;}); 

这样做:

svg.selectAll('.nameinfo circle') 
    .data(data, function(d) { return d.name;}) 
    .transition().duration(500) 
    .attr('r', function(d){ return d.value/2;}); 

UPDATE:下面是适合与重用现有的数据/选择整体D3理念更好的另一种方式:

points 
    .select('circle').transition().duration(500) 
    .attr('r', function(d){ return d.value/2;}); 
+1

此编辑提供所需的行为,但重新绑定数据与我对d3中更新模式的理解背道而驰。为什么仅更新转换需要重新绑定?通过将点var更早地绑定到外部组元素,进入和退出转换没有问题访问圆属性。 – 2013-04-23 10:28:02

+0

@AndrewStaroscik你是对的。更新了答案。感谢[此问题](http://*.com/questions/9649958/d3-js-updating-visual)以获取解决方案的更多线索。 – explunit 2013-04-23 13:20:06

+0

我明白了,区别在于.select和.selectAll。谢谢! – 2013-04-23 14:08:34