2013-07-10 100 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; });