【发布时间】:2013-09-16 10:25:20
【问题描述】:
我正在尝试在 d3 图表上绘制一系列垂直线。数据源是一个 x 位置列表(在数据中),它通过x() 比例函数映射以给出正确的位置。
目前,这被实现为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() 和y() 函数。 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)
我觉得我错过了一些明显的东西。
【问题讨论】:
标签: d3.js data-driven