2016-07-18 6 views
0

SVG内で更新したい新しいデータセットがありますが、スムーズに移行しながらデータを置き換えた要素を正しく取り込む方法がわかりません。D3スタックバーグラフのデータを更新する

http://codepen.io/jacob_johnson/pen/jAkmPG

関連するすべてのコードは、上記CodePenです。しかし、私はここにそのいくつかを掲載します。

// Array to supply graph data 
var FOR_PROFIT = [10,80,10]; 
var NONPROFIT = [60,10,30]; 
var PUBLIC = [40,40,20]; 

var data = [ 
      { 
     "key":"PUBLIC", 
     "pop1":PUBLIC[0], 
     "pop2":PUBLIC[1], 
     "pop3":PUBLIC[2] 
     }, 
      { 
     "key":"NONPROFIT", 
     "pop1":NONPROFIT[0], 
     "pop2":NONPROFIT[1], 
     "pop3":NONPROFIT[2] 
     }, 
      { 
     "key":"FORPROFIT", 
     "pop1":FOR_PROFIT[0], 
     "pop2":FOR_PROFIT[1], 
     "pop3":FOR_PROFIT[2] 
     } 
]; 

Iは、2つのデータ配列(と呼ばれる1つのデータと変更された情報を持つ別呼ばDATA2)を有します。基本的に、作成したグラフを新しいデータに変換したいと思っています。古いグラフ上でグラフを書き直すには十分理解していますが、私はトランジションを得ていませんし、私が持っているものを変更するのではなく、古いデータの上に新しいデータを印刷するだけです。

var n = 3, // Number of layers 
     m = data.length, // Number of samples per layer 
     stack = d3.layout.stack(), 
     labels = data.map(function(d) { return d.key; }),  
     layers = stack(d3.range(n).map(function(d) 
     { 
      var a = []; 
      for (var i = 0; i < m; ++i) 
      { 
       a[i] = { x: i, y: data[i]['pop' + (d+1)] }; 
      } 
      return a; 
     })), 
     // The largest single layer 
     yGroupMax = d3.max(layers, function(layer) { return d3.max(layer, function(d) { return d.y; }); }), 
     // The largest stack 
     yStackMax = d3.max(layers, function(layer) { return d3.max(layer, function(d) { return d.y0 + d.y; }); }); 

    var margin = {top: 40, right: 10, bottom: 20, left: 150}, 
     width = 677 - margin.left - margin.right, 
     height = 212 - margin.top - margin.bottom; 

    var y = d3.scale.ordinal() 
     .domain(d3.range(m)) 
     .rangeRoundBands([2, height], .08); 

    var x = d3.scale.linear() 
     .domain([0, yStackMax]) 
     .range([0, width]); 

    var color = d3.scale.linear() 
     .domain([0, n - 1]) 
     .range(["#aad", "#556"]); 

    var svg = d3.select("svg") 
     .attr("width", width + margin.left + margin.right) 
     .attr("height", height + margin.top + margin.bottom) 
     .append("g") 
     .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 

    var layer = svg.selectAll(".layer") 
     .data(layers) 
     .enter().append("g") 
     .attr("class", "layer") 
     .style("fill", function(d, i) { 
      return color(i); 
     }); 

    layer.selectAll("rect") 
     .data(function(d) { 
      return d; 
     }) 
     .enter().append("rect") 
     .attr("y", function(d) { 
      return y(d.x); 
     }) 
     .attr("x", function(d) { 
      return x(d.y0); 
     }) 
     .attr("height", y.rangeBand()) 
     .attr("width", function(d) { 
      return x(d.y); 
     }); 

これは、レイヤーが個々のバーであるグラフの作成を処理するものです。今私はこれを見た:https://bl.ocks.org/mbostock/1134768しかし、私はまだそれほどよくコメントされていないとして理解していない。

これに関するガイダンス、リンク、またはヘルプは素晴らしいと思います。ありがとう。

答えて

1

あなたの解決策:http://codepen.io/typhon/pen/bZLoZW

は、この情報がお役に立てば幸いです!

あなたは、ライン200(またはその逆)

読むアップデートでduration(500)に渡されたパラメータを増加させることにより、トランジションの速度を遅く出入り選択することができます。彼らはD3で作業している間、ほとんどいつも便利です。参考にしてthisとしてください。

+0

これは素晴らしいです。私は本当にリンクを感謝します! –

関連する問題