2016-06-02 4 views
0

私は素敵なd3.jsライブラリを使用して動的なツリーマップグラフィックを作成しようとしています。 は、ここに私のコードd3 treemapグラフィックがenter()とexit()データを正しく認識しない

element = d3.select(element[0]); 
var margin = 10, 
    width = parseInt(element.style('width')) - margin * 2, 
    height = parseInt(element.style('height')) - margin * 2; 

var color = d3.scale.category10(); 

var canvas = d3.select('.treemap').append('svg') 
    .attr('width', width) 
    .attr('height', height) 
    .attr('transform', 'translate(-.5,-.5)') 
    .style('margin', margin); 

var treemap = d3.layout.treemap() 
    .size([width, height]) 
    .value(function(d) { return d.value; }) 
    .sticky(false); 

function redraw(data) { 
    d3.selectAll('.cell').remove(); 
    var treemapData = {}; 
    treemapData.children = data.map(function(d) { 
     return { 
     name: d.name, 
     value: d.value 
     }; 
    }); 

    var leaves = treemap(treemapData); 

    var cells = canvas.selectAll("g") 
    .data(leaves); 

    var cellsEnter = cells.enter() 
    .append('rect') 
    .attr('class', 'cell') 
    .attr('x', function(d) { return d.x; }) 
    .attr('y', function(d) { return d.y; }) 
    .attr('width', function(d) { return d.dx; }) 
    .attr('height', function(d) { return d.dy; }) 
    .attr('fill', function(d) { return d.children ? null : color(d.name); }) 
    .attr('stroke', "#fff") 
    .style('fill-opacity', 0); 

console.log(cells.exit(), cells.enter()); 
} 

そして、ここで私がstuckedているのサンプルです。 console.log()は、新しいデータ全体がenter()であり、exit()でないことを示しています!

入力データは、ルートオブジェクトフィールドなし

[{value: 590, name:"A1"}, {...}, ...] 

のように提示し、私はtreemapDataオブジェクト内のデータを再マッピング理由です。

Тあなたは少なくともこの投稿を読んであなたの時間を過ごしたことをありがとうございました。何か提案がありましたら幸いです。

UDP。 https://jsfiddle.net/qtbfm08k/

+1

'd3.selectAll( '。cell')。remove();' ...があります。つまり、exit()の選択項目に含まれるものはすべて削除します。とにかく、「再描画」と呼ばれる方法を示すことができますか? – tarulen

+0

@tarulen 'cells.exit()。remove()'が機能しないので、 'd3.selectAll( '。cell')。remove();'を使うので、新しいデータセットごとに矩形が積み重なります。私はこの行の意味を理解し、デバッグ中にそれを考慮します。 私はAngularアプリケーションで作業していますので、 'redraw'呼び出しのすべてのケースを表示するのは難しいですが、データに同じフィールドを持つ異なる長さの配列の配列が含まれていることを保証できます。 –

+0

それでよかったです。今度は 'var cells = canvas.selectAll(" g ")'を使って 'rect'オブジェクトを追加します。代わりに' .selectAll( "rect") 'を試しましたか(それとも' .selectAll( "。セル ")')? – tarulen

答えて

2

次作品:あなたはここに私のコードの作業バージョンを確認することができます

  • d3.selectAll('.cell').remove();

フィドルを参照してください以下のコードを使用削除:https://jsfiddle.net/b6meLedn/4/

var cells = canvas.selectAll('.cell') //select all cells 
    .data(leaves);  //map the data 

    cells.exit().remove(); //remove old extra elements 
    cells.enter() 
    .append('rect')  //create new rectangles as necessary 
    .attr('class', 'cell') 

    cells     //take all cells (old cells that have new data+extra new cells) 
    .attr('x', function(d) { return d.x; }) 
    ... 
+0

助けてくれてありがとう! –

+0

@tarulenそれは素晴らしい解決策でした。それに加えて、各セルにテキストを追加し、長方形のサイズをカスタマイズするにはどうすればいいですか? –

+0

私はテキストのことを考え出しました。正方形の場合 –

関連する問題