我正在尝试使用D3
创建一个正方形网格。我的代码可以工作,但是我想在每个正方形周围添加一些填充,这样网格看起来就不那么“紧凑”了。
下面是我的代码:
class Matrix {
constructor(parentElement, data1, data2, data3) {
this.parentElement = parentElement;
this.data1 = data1;
this.data2 = data2;
this.data3 = data3;
this.cellHeight = 40;
this.cellWidth = 40;
this.initializeVisual()
}
initializeVisual() {
let vis = this;
vis.margin = {top: 20, right: 20, bottom: 20, left: 40};
vis.width = document.getElementById(vis.parentElement).getBoundingClientRect().width - vis.margin.left - vis.margin.right;
vis.height = 800 - vis.margin.top - vis.margin.bottom;
// init drawing area
vis.svg = d3.select('#' + vis.parentElement).append('svg')
.attr('width', vis.width + vis.margin.left + vis.margin.right)
.attr('height', vis.height + vis.margin.top + vis.margin.bottom)
.append('g')
.attr('transform', `translate (${vis.margin.left}, ${vis.margin.top})`);
// Draws the initial grid
let squaresPerRow = 16
let scale = d3.scaleLinear()
.domain([0, squaresPerRow -1])
.range([0, this.cellWidth * squaresPerRow])
vis.squares = vis.svg.selectAll('.squares')
.data(d3.range(256))
.enter()
.append('rect')
.attr('x', (d, i) => {
let n = i % squaresPerRow
return scale(n)
})
.attr('y', (d, i) => {
let n = Math.floor(i / 16)
return scale(n)
})
.attr('width', this.cellWidth)
.attr('height', this.cellHeight)
.attr('fill', 'lightgrey');
}
生成的网格如下所示:
如何添加填充?
谢谢你!
1条答案
按热度按时间6yjfywim1#
就我个人而言,我会将线性标度改为点标度,但这里有一个使用大部分代码的解决方案。
首先,去掉域中的负1,这是一种创建填充的繁琐方法:
然后,在设置填充(此处命名为
padding
)后,可以将x
和y
的位置平移一半,并将矩形的宽度和高度减去该填充。下面是一个演示,针对不同的空间更改变量
padding
:第一个