D3.js v4圆弧半径转换不按预期工作

问题描述:

使用D3.js v4,我试图更新按钮单击上的圆的半径。D3.js v4圆弧半径转换不按预期工作

问题在于,在每次更新时,将重绘(而不是从'radius1'到0,然后到'radius2')圆形的smooth transitions between the radii

下面是完整的代码: https://jsfiddle.net/4r6hp9my/

这里的圈子更新的代码片段:

 var circles = svg.selectAll('circle').data(dataset); 

     var enter = circles 
     .enter() 
     .append('circle') 
     .attrs({ 
      cx: w/2, 
      cy: h/2, 
      fill: colorsScale, 
      r: function(d,i){ 
       if(i == myCounter){ 
        var x = rScale(d) 
       return x; 
       } 
      } 
     }); 

     d3.select('#theButton') 
      .on('click',function(){ 
       myCounter++ 
       if(myCounter == dataset.length){ 
        myCounter = 0; 
       }; 
       updateData() 
      }); 

     function updateData(){ 
      circles 
      .merge(enter) 
      .transition() 
      .attr('r',function(d,i){ 
       if(i == myCounter){ 
        return rScale(d); 
       } 
      }); 
      labels 
      .text(function(d,i){ 
       if(i == myCounter){ 
       return d; 
       } 
      }); 

     }; 
+0

当您第一次打开小提琴时,您认为有多少个圈子? – echonax

+0

不知道我是否理解这个问题,应该只有一个圆圈,其半径被更新(基于一维数组中的值),每按一次按钮,点击 –

+0

:)打开你的检查器,看看你的svg元素。已经附加了9个圈子到你的svg。也就是说,每个'dataset'元素都有1个。 – echonax

正如echonax提到的,问题是你创建一个基于数据集的多个圈。为了平滑过渡,只绘制一个圆圈,并根据'myCounter'更新半径。举个例子:

var dataset = [2184,2184,3460,2610,2610,2452,842,1349,2430]; 
 

 
var myCounter = 0; 
 
//svg dimensions 
 
var h = 200; 
 
var w = 200; 
 

 
var svg = d3.select('body') 
 
.append('svg') 
 
.attrs({ 
 
    width: w, 
 
    height: h 
 
}) 
 
.classed('middle',true); 
 
//color mapping 
 
var colorsScale = d3.scaleLinear() 
 
.domain([d3.min(dataset),d3.max(dataset)]) 
 
.range(['#FFB832','#C61C6F']); 
 
//radius mapping 
 
var rScale = d3.scaleLinear().domain([0, d3.max(dataset)]).range([0,50]) 
 
//labels 
 
var label = svg.append("text").attrs({ 
 
    x: w/2, 
 
    y: 20 
 
}).text(function(){ return dataset[myCounter] }); 
 

 
//draw the circles 
 
var circle = svg.append('circle') 
 
.attrs({ 
 
    cx: w/2, 
 
    cy: h/2, 
 
    fill: function() { return colorsScale(dataset[myCounter]) }, 
 
    r: function() { return rScale(dataset[myCounter]) } 
 
}); 
 
//button click 
 
d3.select('#theButton') 
 
    .on('click',function(){ 
 
    updateData() 
 
}); 
 

 
function updateData(){ 
 
\t myCounter++; 
 
    if (myCounter > dataset.length - 1) myCounter = 0; 
 
    circle.transition().attr('r',function(){ return rScale(dataset[myCounter]) }).attr('fill', function() { return colorsScale(dataset[myCounter]) }); 
 
    label.text(function(){ return dataset[myCounter] }); 
 
};
html, body{ 
 
\t height: 100%; 
 
} 
 

 
.middle{ 
 
\t margin: 100px auto; 
 
} 
 

 
#theButton{ 
 
\t position: absolute; 
 
\t left:50px; 
 
\t top:50px; 
 
}
<script src="https://d3js.org/d3.v4.js"></script> 
 
<script src="https://d3js.org/d3-selection-multi.v1.min.js"></script> 
 
     
 
<button id="theButton" type="button">Click Me!</button>

根据您的数据,有几次的圈子不会改变,因为该数据是一样的,但是当它的过渡应该工作。

+1

不错,upvoted,但你可以放弃'g'。 –

+1

甚至没有意识到我会把它放在那里!删除。 –

+1

非常感谢! –