2016-11-30 17 views
0

私はd3.jsを初めて使い、ビジュアルコミュニケーションの背景を持っているので視覚的にデータを魅力的にする方法を模索しています。 あなたのエキスパートが私にいくつかのアニメーションに直面している課題を解決する手助けをすることができるかどうか疑問に思っていました。D3.jsドーナツチャート(アスタットプロット)をページ遷移にアニメーション表示するにはどうすればいいですか

私は弾力のあるエフェクトを使ってページの読み込み時にグラフをアニメーション化したいと思っていました。 ここで私が想像している移行を伴う棒グラフの例として、

var bardata = []; 
 

 
for (var i=0; i < 100; i++) \t { 
 
\t bardata.push(Math.round(Math.random()*30)) 
 
} 
 

 
var height = 400, 
 
    width = 600, 
 
    barWidth = 50, 
 
    barOffset = 5; 
 

 
var tempColor; 
 

 
var tooltip = d3.select('body').append('div') 
 
\t \t \t \t .style('position', 'absolute') 
 
\t \t \t \t .style('padding', '0 10px') 
 
\t \t \t \t .style('background', 'white') 
 
\t \t \t \t .style('opacity', 0) 
 

 
var color = d3.scale.linear() 
 
\t \t \t \t .domain([0, bardata.length*.33, bardata.length*.66, bardata.length]) 
 
\t \t \t \t .range(['#FFB832','#C61C6F', 'red', 'blue']) 
 

 
var yScale = d3.scale.linear() 
 
\t \t \t \t .domain([0, d3.max(bardata)]) 
 
\t \t \t \t .range([0, height]); 
 

 
var xScale = d3.scale.ordinal() 
 
\t \t \t \t .domain(d3.range(0, bardata.length)) 
 
\t \t \t \t .rangeBands([0, width]) 
 

 

 
var myChart = d3.select('#chart').append('svg') 
 
\t \t \t  .attr('width', width) 
 
\t \t \t  .attr('height', height) 
 
\t \t \t  .selectAll('rect').data(bardata) 
 
\t \t \t  .enter().append('rect') 
 
\t \t \t   .style('fill', function(d, i) { 
 
\t \t \t   \t return color(i); 
 
\t \t \t   }) 
 
\t \t \t   .attr('width', xScale.rangeBand()) 
 
\t \t \t   .attr('height', 0) 
 
\t \t \t   .attr('x', function(d,i) { 
 
\t \t \t    return xScale(i); 
 
\t \t \t   }) 
 
\t \t \t   .attr('y', height - 0) 
 
\t \t \t  .on('mouseover', function(d) { 
 

 

 
\t \t \t  \t tooltip.transition() 
 
\t \t \t  \t \t .style('opacity', .9) 
 

 
\t \t \t  \t tooltip.html(d) 
 
\t \t \t  \t \t .style('left', (d3.event.pageX - 35) + 'px') 
 
\t \t \t  \t \t .style('top', (d3.event.pageY - 35) + 'px') 
 

 
\t \t \t  \t tempColor = this.style.fill; 
 
\t \t \t  \t d3.select(this) 
 
\t \t \t  \t \t .style('opacity', .5) 
 
\t \t \t  \t \t .style('fill', 'yellow') 
 
\t \t \t  }) 
 
\t \t \t  .on('mouseout', function(d) { 
 
\t \t \t  \t 
 
\t \t \t  tooltip.transition() 
 
\t \t \t  \t \t .style('opacity', 0) 
 

 
\t \t \t  \t d3.select(this) 
 
\t \t \t  \t \t .style('opacity', 1) 
 
\t \t \t  \t \t .style('fill', tempColor) 
 
\t \t \t  }); 
 

 

 
myChart.transition() 
 
\t \t .attr('height', function(d) { 
 

 
\t \t \t    return yScale(d); 
 
\t \t \t   }) 
 
     .attr('y', function(d) { 
 
\t \t \t    return height - yScale(d); 
 
\t \t \t   }) 
 
     .delay(function(d,i) { 
 
     \t return i * 15; 
 
     }) 
 
     .ease('elastic') 
 
     .duration(1000)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<body> 
 
    <div class="container"> 
 
    <h2>Bar chart</h2> 
 
    <div id="chart"></div> 
 
    </div> 
 

 
</body>

今私はドーナツグラフのための同じ遷移を作りたかった、またはより良い以下、このようなアスタープロットは語りました。中央から外側へのページの読み込み時のアニメーション。 http://bl.ocks.org/bbest/2de0e25d4840c68f2db1

私はここ数週間何度も挑戦してきましたが、私はまだ新しいので、何か助けを求めてここに来なければなりませんでした。

ここにいくつかの専門家のアドバイスをお願いします!

答えて

0

「Aster Plot」の例と「Arc Tween」の例をマージしてデータに適用することで、同じ問題(内側半径から最終半径までのアスタリットプロットスライスをアニメーション化) 。 それが最高の解決策であるかどうかはわかりませんが(少なくともd3 noobでも)、少なくともそれは機能しています。

基本的には、円弧を描くときに、円弧関数を直接呼び出すのではなく、を呼び出して、円弧関数を補間と呼ぶarcTween関数を呼び出します。

ので

arcs.append('path') 
    (other attr like filling, stroke, etc) 
    .attr('d',arc) 

arcs.append("path") 
// (other attr like filling, stroke, etc) 
    .transition() 
    .duration(500) 
    .attrTween('d', arcTween(innerRadius)); 

になり、機能arcTweenは、あなたがそのパイスライスのために取得したいouterRadiusこと

function arcTween(newH) { 
    return function(d) { 
    var interpolate = d3.interpolate(newH, d.data.hauteur); 
    return function(t) { 
     d.data.hauteur = interpolate(t); 
     return arc(d); 
    } 
    } 
} 

d.data.hauteurです。

関連する問題