2017-03-26 4 views
0

d3 v4を使用してblockを書き換えようとしたときに、drawWithDataが2度目に呼び出されるまでサークルが表示されない。 「追加」または「描画」をクリックすると、効果を確認できます。D3 v4 enter()トランジションで最初の呼び出し時にキャンバスに円を描くことができない

強制オブジェクトをv4シミュレーションオブジェクトに変更する以外に、キャンバスの描画方法とDOMオブジェクトの遷移を同じにする必要があります。

jsfiddleをご覧になりたい方は

circles.transition() 
     .duration(500) 
     .attr('r', function(d){ 
      return d.r; 
     }); 

へ:

circles = container.selectAll('circle') 
        .data(data); 

// Insertion animation. 
newCircles = circles.enter() 
        .append('circle') 
        .attr("id", function(d, i){ return d.id; }) 
        .attr('r', 0) 
        .attr('alpha', 1) 
        ; 

circles.transition() 
     .duration(500) 
     .attr('r', function(d){ 
      return d.r; 
     }); 

// Deletion animation 
dyingCircles = circles.exit(); 
dyingCircles.transition() 
      .duration(200) 
      .attr('r', 0) 
      .attr('alpha', 0) 
      .remove(); 

simulation.on('tick', function() { 
    var renderStart = new Date(); 
    context.clearRect(0, 0, width, height); 
    context.fillStyle = "rgb(70, 130, 180)"; 
    context.beginPath(); 

    circles.each(function(d) { 
     context.moveTo(d.x, d.y); 
     var radius = d3.select(this).attr('r'); // because d.r contains the final value 
     context.arc(d.x, d.y, radius, 0, 2 * Math.PI); 
    }); 

    dyingCircles.each(function(d) { 
     context.moveTo(d.x, d.y); 
     var alpha = d3.select(this).attr('alpha'); 
     context.fillStyle = "rgb(70, 130, 180, "+alpha+")"; 
     var radius = d3.select(this).attr('r'); // because d.r contains the final value 
     context.arc(d.x, d.y, radius, 0, 2 * Math.PI); 
    }); 

    context.fill(); 

    time += (new Date() - renderStart); 
    ticks++; 
}); 

答えて

2

は私が変更:以下は、関数drawWithData(データ、シミュレーション)の内容である

newCircles.transition() 
     .duration(500) 
     .attr('r', function(d){ 
      return d.r; 
     }); 

とドローボタンは、最初のクリックで動作します。 dyingCirclesを遷移させるときは、次のように、newCirclesにも同じことを行います。

+0

あなたはまだnewCirclesの代わりに 'circles'を参照している他の1つのスポットを逃しました(92行目)が、これは正しいトラックにあります。 –

+0

ありがとうブルースとダン!トランジションは入力または終了の選択に適用する必要があるようです...私はまだd3の一般的な更新フローを学習しています。元のサンプルが最初にどのように働いたのだろうか。私はまた、3つの選択(円、newCirclesとdyingCircles)すべてにdraw関数を適用しなければなりませんでした。更新されたjsfiddleはここにあります:https://jsfiddle.net/u3ntL9b9/26/ –

関連する問題