我正在尝试在 d3 图表上绘制一系列垂直线。数据源是一个 x 位置列表(在数据中),它通过x()
scale 函数映射以给出正确的位置。
目前,这被实现为变量for
中每个条目的循环。labels
y 原点和端点取自数据minY
和maxY
。文本标签附加到行尾。
labels = [
{
'x':50,
'label':test'
}
var label = svg.append("g")
.attr("class","ilabel")
// Labels
for (var i = 0; i < labels.length; i++) {
labl = labels[i];
label.append('line')
.attr('x1', x( labl.x ) )
.attr('y1', y( maxY ) )
.attr('x2', x( labl.x )
.attr('y2', y( minY ) )
.attr("class","ilabel-line");
label.append("text")
.attr("transform", "translate(" + x( labl.x )+"," + y( maxY )+ ") rotate(-60)")
.style("text-anchor", "start")
.attr("dx", ".5em")
.attr("class","ilabel-label")
.text(labl.label);
}
我将如何以数据驱动的方式重新编写它,即将标签作为.data
然后迭代它以绘制一系列平行的垂直线。
var label = svg.selectAll(".ilabel")
.data(labels)
.enter().append("g")
.attr("class","ilabel")
我难以理解的一点是x()
andy()
函数。x()
当然应该返回线的 x 位置(对于给定的线是常数),但是 y 函数应该如何/应该返回以在两个定义的点(minY
& maxY
)之间绘制一条线。
line = d3.svg.line()
.x(function(d) { return x(d.x); })
.y(function(d) { return y(d.y); });
label.append('path')
.attr("d", line)
我觉得我错过了一些明显的东西。