因此,在上面的一些有用的评论之后,我已经接近了一个解决方案。使用 Ordinal 范围带可以让我靠近我想去的地方。
我通过使用轴上的刻度数作为输入域范围的基础来创建范围带:
var xScale = d3.scale.ordinal()
.domain(d3.range(10))
.rangeRoundBands([0, width],0);
var yScale = d3.scale.ordinal()
.domain(d3.range(4))
.rangeRoundBands([0, height],0);
然后我尝试像这样绘制矩形:
svg.selectAll("rect")
.data(p)
.enter()
.append("rect")
.attr("x", function(d, i) {
return xScale(i);
})
.attr("y", function(d,i) {
0
})
.attr("width", xScale.rangeBand())
.attr("height", yScale.rangeBand())
.attr("fill", "green").
attr('stroke','red');
这让我得到了想要的效果,但只有一行深:
http://jsfiddle.net/Ny2FJ/2/
我想以某种方式为整个表格绘制绿色块(并且也不必硬编码序数刻度域中的刻度数)。然后我尝试像这样将范围带应用于 y 轴(知道这不会真正起作用)http://jsfiddle.net/Ny2FJ/3/
svg.selectAll("rect")
.data(p)
.enter()
.append("rect")
.attr("x", function(d, i) {
return xScale(i);
})
.attr("y", function(d,i) {
return yScale(i);
})
.attr("width", xScale.rangeBand())
.attr("height", yScale.rangeBand())
.attr("fill", "green").
attr('stroke','red');
我能想到的唯一方法是引入一个 for 循环来为 y 轴的每个刻度运行这个小提琴http://jsfiddle.net/Ny2FJ/2/中的代码块。