我创建了一个水平图例,显示在我用d3.js创建的条形图上方。d3.js - 计算以前绘制的元素的宽度
这是我的第一次尝试,我努力想知道如何将每个项目放在图例中,以考虑前一项目的宽度。
所以这是我看到目前为止:
这里是我的代码相关的传说渲染:
var legendRectSize = 18,
legendSpacing = 4;
svg.selectAll('.legend')
.data(data.chartKeys)
.enter()
.append('g')
.attr('class', 'legend')
.attr('transform', function(d, i) {
//width = the chart area width
var horz = width/2 + i*100; //This needs to add previously rendered elements width instead
return 'translate(' + horz + ',' + 0 + ')';
});
svg.selectAll('.legend').append('rect')
.attr('width', legendRectSize)
.attr('height', legendRectSize)
.attr('class', function(d) {
return d;
})
.style('stroke', 'black');
svg.selectAll('.legend').append('text')
.attr('x', legendRectSize + legendSpacing)
.attr('y', legendRectSize - legendSpacing)
.text(function(d) {
return d;
});
正如你可以在变换看函数我只是将每个项目的索引乘以100来横向扩展它们,但实际上我可以通过确定先前渲染的元素的宽度(如此彩色的框和文本组合)并添加它来代替spacin他们之间的平衡是平等的,没有任何重叠。
在转换函数中是否有一种方法可以获得前一个项目或最佳方法?
感谢
你可以用'.getBBox()'的DOM元素来获得它们的尺寸,一旦他们被吸引。然后你可以根据这个重新调整位置。 –