【发布时间】:2015-12-03 03:07:19
【问题描述】:
我正在创建一个水平图例以显示在我使用 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 以将它们水平展开,但实际上我可以确定先前渲染元素的宽度(所以彩色框和文本组合)并添加它,以便它们之间的间距是均匀的,并且没有任何重叠。
transform 函数中是否有一种方法可以获取前一个项目,或者其他方法是否最好?
谢谢
【问题讨论】:
-
您可以在 DOM 元素上使用
.getBBox()以在绘制它们后获取它们的尺寸。然后你可以根据它重新调整位置。