私は素敵な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/
'd3.selectAll( '。cell')。remove();' ...があります。つまり、exit()の選択項目に含まれるものはすべて削除します。とにかく、「再描画」と呼ばれる方法を示すことができますか? – tarulen
@tarulen 'cells.exit()。remove()'が機能しないので、 'd3.selectAll( '。cell')。remove();'を使うので、新しいデータセットごとに矩形が積み重なります。私はこの行の意味を理解し、デバッグ中にそれを考慮します。 私はAngularアプリケーションで作業していますので、 'redraw'呼び出しのすべてのケースを表示するのは難しいですが、データに同じフィールドを持つ異なる長さの配列の配列が含まれていることを保証できます。 –
それでよかったです。今度は 'var cells = canvas.selectAll(" g ")'を使って 'rect'オブジェクトを追加します。代わりに' .selectAll( "rect") 'を試しましたか(それとも' .selectAll( "。セル ")')? – tarulen