2013-07-10 137 views

回答

3

這裏是代碼的重要部分:

state.selectAll("rect") 
     .data(function(d) { return d.ages; }) 
    .enter().append("rect") 
     .attr("width", x.rangeBand()) 
     .attr("y", function(d) { return y(d.y1); }) 
     .attr("height", function(d) { return y(d.y0) - y(d.y1); }) 
     .style("fill", function(d) { return color(d.name); }); 

這將每個data點綁定到彩色矩形。要添加文本,這樣的改變:

var ages_enter = state.selectAll("rect") 
     .data(function(d) { return d.ages; }) 
    .enter(); 
    ages_enter.append("rect") 
     .attr("width", x.rangeBand()) 
     .attr("y", function(d) { return y(d.y1); }) 
     .attr("height", function(d) { return y(d.y0) - y(d.y1); }) 
     .style("fill", function(d) { return color(d.name); }); 
    ages_enter.append("text") 
     .text(function(d) { return d3.format(".2s")(d.y1); }) 
     .attr("y", function(d) { return y(d.y1)+16; }) 
     .style("stroke", '#ffffff'); 

它保存了一個指針,被稱爲每個數據點的「輸入法」,然後添加一個額外的元素,以SVG的每個數據點。

+0

謝謝你的回答。這隻會在一個欄中添加文本,我想在每個欄中添加(兩個)。 – user2401221

+0

我有一種感覺,現在的問題是它正在繪製文本和框,但在以前的文本頂部繪製下面的框。 Svg沒有z-index,它基於事物追加的順序。我現在正在打電話,但我會稍後嘗試運行演示。 –

+0

我改變了我的答案。懷疑得到證實。文本正在顯示,但正在下一個欄的下方顯示(z軸)。我已經通過將文本向下移動16px來修復它。 –

0

我用這段代碼繪製出來了。文本將追加到堆積圖的中心。我們需要找出文本位置的x座標值。使用barWidth/2。 Demo Sorted Stacked Bar Chart

var state= svg.selectAll(".state") 
    .data(data) 
.enter().append("g") 
    .attr("class", "state") 
    .attr("transform", function(d) { return "translate(" + (x(d.state)) + ",0)"; }); 

    module.selectAll("rect") 
    .data(function(d) { return d.ages; }) 
    .enter().append("rect") 
    .attr("width", x.rangeBand()) 
    .attr("y", 200) 
    .attr("height", 100) 
    .style("fill", function(d) { return color(d.name); }) 
    .transition() 
    .delay(function(d, i) { return i * 200; }) 
    .duration(4000) 
    .attr("y", function(d) { return y(d.y1); }) 
    .attr('height', function(d) { return y(d.y0) - y(d.y1); }); 

module.append("text") 
    .attr("y", 400) 
    .attr("x",x.rangeBand()/2) 
    .style("text-anchor", "middle") 
    .style("font-size", "20px") 
    .style("color", "white") 
    .text(function(d,i) { return i+1; });