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 位置 (特定の線に対して定数) を返す必要がありますが、定義された 2 つの点 ( & )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)
明らかな何かが欠けているように感じます。