d3 treemap 图形无法正确识别 enter() 和 exit() 数据
d3 treemap graphic don't recognize enter() and exit() data correctly
我正在尝试使用可爱的 d3.js 库创建动态树状图图形。
这是我的代码示例
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());
}
我一直坚持到这里。
console.log()表示整个新数据是enter(),none是exit()!
输入数据呈现
[{value: 590, name:"A1"}, {...}, ...]
没有根对象字段,所以这就是我在 treemapData 对象中重新映射数据的原因。
T 感谢您至少花时间阅读到目前为止 post,希望您有任何建议。
UDP。你可以在这里查看我的代码的工作版本:https://jsfiddle.net/qtbfm08k/
以下作品:
- 移除
d3.selectAll('.cell').remove();
- 使用下面的代码
参见fiddle: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; })
...
我正在尝试使用可爱的 d3.js 库创建动态树状图图形。 这是我的代码示例
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());
}
我一直坚持到这里。 console.log()表示整个新数据是enter(),none是exit()!
输入数据呈现
[{value: 590, name:"A1"}, {...}, ...]
没有根对象字段,所以这就是我在 treemapData 对象中重新映射数据的原因。
T 感谢您至少花时间阅读到目前为止 post,希望您有任何建议。
UDP。你可以在这里查看我的代码的工作版本:https://jsfiddle.net/qtbfm08k/
以下作品:
- 移除
d3.selectAll('.cell').remove();
- 使用下面的代码
参见fiddle: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; })
...