除了 mbostock 的好答案之外,这可能会澄清嵌套方面。
您的数据有 2 度嵌套。您有一个包含 2 个对象的数组,每个对象都有一个整数数组。如果您希望最终图像反映这些差异,则需要为每个图像进行连接。
这是一个解决方案:每个用户由一个组g
元素表示,每个分数由一个rect
. 您可以通过以下几种方式做到这一点:要么datum
在 svg 上使用,然后在g
每个g
. 使用data
ong
更典型,但这里有两种方法:
在 svg 上使用数据:
var chart = d3.select('body').append('svg')
.datum(data) // <---- datum
.attr('width',800)
.attr('height',350)
.selectAll('g')
.data(function(d){ return d; }) // <----- identity function
.enter().append('g')
.attr('class', function(d) { return d.user; })
.attr('transform', function(d, i) { return 'translate(0, ' + i * 140 + ')'; })
.selectAll('rect')
.data(function(d) { return d.scores; })
.enter().append('rect')
.attr('y', function(d, i) { return i * 20; })
.attr('width', function(d) { return d; })
.attr('height', 20);
使用 group ( g
) 元素上的数据:
var chart = d3.select('body').append('svg')
.attr('width',800)
.attr('height',350)
.selectAll('g')
.data(data) // <--- attach directly to the g
.enter().append('g')
.attr('class', function(d) { return d.user; })
.attr('transform', function(d, i) { return 'translate(0, ' + i * 140 + ')'; })
.selectAll('rect')
.data(function(d) { return d.scores; })
.enter().append('rect')
.attr('y', function(d, i) { return i * 20; })
.attr('width', function(d) { return d; })
.attr('height', 20);
同样,您不必创建这些 g 元素,但通过这样做,我现在可以以不同的方式表示用户分数(它们与变换有不同的 y),我还可以为它们赋予不同的样式,如下所示:
.jim {
fill: red;
}
.ray {
fill: blue;
}