2016-12-14 7 views
1

これは一部の人にとっては些細かもしれませんが、私はD3JSの初心者です。D3JS振動気泡

私は、配列に対して不透明度が変化する2つの静的なバブルをプロットしようとしています。私は気泡をプロットすることができますが、不透明度を連続的に変更することはできません。 transitiondelayを使用しています。不透明度は1回しか変更できません。ここに私のコードサンプル

(function() { 

    var dropsize = 100; 
    var gapsize = 20; 
    var osc = [[1, 1],[0.5, 0.5],[0, 0],[0.5, 0.5],[1, 1],[0.5, 0.5],[0, 0],[0.5, 0.5]]; 
    var radius = dropsize/2; 
    var h = 100; 
    var w = (4 * radius + 3 * gapsize); 
    var svg = d3.select("#chart").append("svg"); 
    var svg = d3.select("body") 
    .append("svg") 
    .attr("width", w) 
    .attr("height", h) 
    .style("background-color", "teal"); 
    var circles = svg.selectAll("circle") 
    .data([radius, 3 * radius]) 
    .enter() 
    .append("circle"); 
    circles.attr("cx", function(d, i) { 
     return d + (i + 1) * gapsize; 
    }) 
    .attr("cy", h/2) 
    .attr("r", function(d, i) { 
     return radius; 
    }) 
    .attr("fill", "orange") 
    .attr("class", "droplet") 
    .attr("id", function(d, i) { 
     return "c_" + (i + 1); 
    }); 
    d3.select("#c_1") 
    .data(osc) 
    .transition().delay(function(d, i) { 
     return i * 1000; 
    }) 
    .duration(1000) 
    .attr("opacity", function(d) { 
     return d[0] 
    }); 
})(); 

で継続的にあなたが移行を繰り返すと対照的に、次の1つの不透明状態からすぐに切り替えるのではなく、スムーズに移行を意味し、私はによって仮定ペンBubble Chart with D3.js using Realtime Data

答えて

2

もしでのより良いです"継続的に"あなたはトランジションを無限に実行することを意味し、on("end")を使用してトランジション関数を再度呼び出します。

var toggle; 
 

 
var data = [0, 1]; 
 

 
transition(); 
 

 
function transition() { 
 
    toggle ^= 1; 
 
    d3.select("circle") 
 
     .transition() 
 
     .duration(1000) 
 
     .style("opacity", data[toggle]) 
 
     .on("end", transition); 
 
}
<script src="https://d3js.org/d3.v4.min.js"></script> 
 
<svg> 
 
\t <circle cx="100" cy="100" r="50"></circle> 
 
</svg>

+0

これはうまくいきます。ありがとう@ジェラルド・ファルタド。 2つの泡は、異なる不透明度で振動することができなければならない。だから1つのペアには、それぞれのバブルの不透明度が含まれています – kthouz

+0

これはもっと理にかなっています!私のコードでは、データ配列の2つの値は不透明度の2つの振動値です。 –

+1

はい、それを得ました。しかし、将来のアプリケーションのために、私は 'setInterval'を次のように使用することにしました。 ' tic = new Date(); setInterval(function(){ dt = Math.round((New Date() - tic)/ 50)%osc.length; d3.select( "#c_1")。transition()。duration(100)。 ( "opacity"、function());d3.select( "#c_2")。transition()。duration(100).style( "opacity"、function() {return osc [dt] [1]}); } ' – kthouz

0

を参照してください。

あなた、あなたがそれらを作成したときの円の初期不透明度を設定するための最初の必要性:

.attr("opacity", 0) 

をそしてd3.selectではなくd3.selectAllを使用するか、またはあなたの変数circles

... 

circles 
    .data(osc) 
    .transition()       
    .delay(function(d,i){ return i*1000; }) 
    .duration(1000) 
    .attr("opacity",function(d){ return d[0] }); 
+0

主な問題は、彼らがより遷移に何の不透明度を持っていないです:ここ

は一例です。最初の値を与える必要があります。 –

+0

私の例を見てください。不透明度の初期値はありませんが、それはうまくいきます。それに加えて、OPがIDで選択しているので(特に、 'selectAll'は意味がないので)、' selectAll'と 'select'の間に違いはありません。 –

+0

@GerardoFurtado私は彼のCodePenでOPコードを実行し、最初の不透明度を追加するまで動作しませんでした。私はあなたのコードを見ていないが、あなたは出発点の価値なしにブラウザ固有のものであることがわかるかもしれない。また、OPが探しているものの私の読書は、私の読書では、 'selectAll'が完璧な意味であなたと違っています –