2013-12-10 52 views
8

のサブ配列:D3:私は次のような構造持つオブジェクト

[ 
    { 'length': 10, attributes: [1,2,3] }, 
    { 'length': 7, attributes: [1,3,4,5] }, 
    { 'length': 12, attributes: [3,5,7,9,10] }, 
] 

and I am doing the following: 


x = d3.scale.linear().domain([0, maxHeight]).range([50, w]), 
y = d3.scale.linear().domain([0, maxHeight]).range([h, 20]); 
z = d3.scale.linear().domain([0, maxHeight]).range([0, h - 20]); 

var chart = svg.selectAll("g.chart") 
    .data(items) 
    .enter() 
    .append("svg:g") 
    .attr("class", "chart"); 

chart.append("svg:rect") 
    .attr("fill", 'darkblue') 
    .attr("class", 'data') 
    .attr("x", function(d, i) { return x(i+1); }) 
    .attr("y", function(d, i) { return bottom - z(d['length']) + 15 }) 
    .attr("width", 4) 
    .attr("height", function(d, i) { return z(d['length']) - z(d['min']); }) 

私がやりたい、何が私の構造の属性に対応してこれらの長方形のそれぞれの上に円を追加しています。私は考えることができる唯一のことは、属性をループし、それらを要素ごと追加され

<g class="chart"> 
    <rect fill="darkblue" class="data" x="626.1538461538462" y="15" width="6" height="530"></rect> 
    <circle cx="626.1538461538462" cy="(y1)" r="5" style="fill: #ffff00; stroke: #808080;"></circle> 
    <circle cx="626.1538461538462" cy="(y2)" r="5" style="fill: #ffff00; stroke: #808080;"></circle> 
    <circle cx="626.1538461538462" cy="(y3)" r="5" style="fill: #ffff00; stroke: #808080;"></circle> 
</g> 

for (z=0; z< 3; ++z) 
{ 
    chart.append("svg:circle") 
    .data(items[z]['attributes']) 
    .style("fill", 'yellow') 
    .style("stroke", "gray") 
    .attr("cx", function(d, i) { return x(i+1); }) 
    .attr("cy", function(d, i) 
    { 
     console.log(d); 
     return bottom - 15; 
    }) 
    .attr("r", 5); 
} 

を基本的には、(} 1「アイテム」のため、私はこのように表示されますこれを行うには良い方法はありますか?

答えて

6

:私はあまりにも小さなjsfiddleを書きましたparent_idx

chart.selectAll("svg:circle") 
    .data(function(item, parent_idx) { 
     return item.attributes.map(function (attr_val) { 
       return { attr_val: attr_val, parent_idx: parent_idx }; 
      }); 
    }) 
    .enter() 
    .append("svg:circle") 
    .style("fill", 'yellow') 
    .style("stroke", "gray") 
    .attr("cx", function(d, i) { return x(d.parent_idx); }) 
    .attr("cy", function(d, i) 
    { 
     return y(d.attr_val); 
    }) 
    .attr("r", 5); 
+0

唯一のi私が持っているのは、x軸上の同じ線上にある円です。基本的には、これらの円は同じ線上にあるはずです(矩形の上に積み重ねられます)。 – Paul

+0

@Paulは 'rect 'に対して' cx'を同じにして答えを更新しました。 –

+0

これは完璧です、素晴らしい作品です!ありがとう! – Paul

3

あなたは、ネストされた選択を使用することができます。主な選択はグループを作成し、各グループがそれにバインドされたデータ項目を持つことになりますがあります。

var data = [ 
    {name: 'A', items: [1, 2]}, 
    {name: 'B', items: [2, 3, 4]} 
]; 

var cScale = d3.scale.category10() 
    .domain(d3.range(10)); 

var grp = svg.selectAll('g.main') 
    .data(data) 
    .enter() 
    .append('g') 
    .attr('class', 'main') 
    .attr('transform', function(d, i) { 
     return 'translate(0,' + i * 20 + ')'; 
    }); 

次に、ネストされた選択を作成して、アクセサメソッドをデータメソッドに渡すことができます。私はRECT要素を備えた例がありますが、円と同じである:

grp.selectAll('rect') 
    .data(function(d) { return d.items; }) 
    .enter() 
    .append('rect') 
    .attr('x', function(d) { return 10 * d; }) 
    .attr('width', 8) 
    .attr('height', 10) 
    .attr('fill', function(d) { return cScale(d); }); 

あなたは記事Nested Selectionsが重宝します。

chart.selectAll("svg:circle") 
    .data(function(item) { return item.attributes; }) 
    .enter() 
    .append("svg:circle") 
    .style("fill", 'yellow') 
    .style("stroke", "gray") 
    .attr("cx", function(d, i) { return x(i+1); }) 
    .attr("cy", function(d, i) 
    { 
     console.log(d); 
     return bottom - 15; 
    }) 
    .attr("r", 5); 

をすることができます、各parentrectに同じcxを保つためにあなたが代わりにループのネストされた選択を作成することができますhttp://jsfiddle.net/pnavarrc/h2YVd/

関連する問題