2013-08-05 7 views
10

D3 çubuk grafiğindeki etiket ekleme hakkında birçok belge okudum ancak bunu çözemiyorum. "Svg.selectAll (" text ")" ifadesinden sonra ne ekleyeceğim.D3 çubuk grafiğine etiket ekleme

sonuç sadece bu örnekte olduğu gibi aynı olacaktır:

var margin = {top: 20, right: 30, bottom: 50, left: 100}, 
    width = 960 - margin.left - margin.right, 
    height = 500 - margin.top - margin.bottom; 


var x = d3.scale.ordinal() 
    .rangeRoundBands([0, width], .1, 1); 

var y = d3.scale.linear() 
    .range([height, 0]); 

var xAxis = d3.svg.axis() 
    .scale(x) 
    .orient("bottom"); 

var yAxis = d3.svg.axis() 
    .scale(y) 
    .orient("left") 
    .tickFormat(function (d) { 
     if ((d/1000000) >= 1) { 
     d = d/1000000 + " " + "000" + " " + "000"; 
     } 
     return d; 
    }); 
var svg = d3.select("body").append("svg") 
    .attr("width", width + margin.left + margin.right) 
    .attr("height", height + margin.top + margin.bottom) 
    .append("g") 
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 

d3.csv("./test.csv", function(error, data) { 

    data.forEach(function(d) { 
    d.internaute = +d.internaute; 
    }); 

    x.domain(data.map(function(d) { return d.date; })); 
    y.domain([0, d3.max(data, function(d) { return d.internaute; })]); 

    svg.append("g") 
     .attr("class", "x axis") 
     .attr("transform", "translate(0," + height + ")") 
     .call(xAxis) 
    .append("text") 
     .attr("x", width/2) 
     .attr("y", 30) 
     .attr("dx", ".71em") 
     .style("text-anchor", "end") 
     .text("Date"); 


    svg.append("g") 
     .attr("class", "y axis") 
     .call(yAxis) 
    .append("text") 
     .attr("transform", "rotate(-90)") 
     .attr("y", 6) 
     .attr("dy", ".71em") 
     .style("text-anchor", "end") 
     .text("Internautes"); 


    svg.selectAll(".bar") 
     .data(data) 
    .enter().append("rect") 
     .attr("class", "bar") 
     .attr("x", function(d) { return x(d.date); }) 
     .attr("width", x.rangeBand()) 
     .attr("y", function(d) { return y(d.internaute); }) 
     .attr("height", function(d) { return height - y(d.internaute);}); 

    svg.selectAll("text") 
    //???? // 

}); 

şimdiden teşekkürler: Burada

enter image description here

kodudur. Beklemeyi umuyorum :)

cevap

14

Bu işe yaramalı!

var yTextPadding = 20; 
svg.selectAll(".bartext") 
.data(data) 
.enter() 
.append("text") 
.attr("class", "bartext") 
.attr("text-anchor", "middle") 
.attr("fill", "white") 
.attr("x", function(d,i) { 
    return x(i)+x.rangeBand()/2; 
}) 
.attr("y", function(d,i) { 
    return height-y(d)+yTextPadding; 
}) 
.text(function(d){ 
    return d; 
}); 

Grafik etiketlerini tanımlamak için nasıl bir sınıf (.bartext) kullandığımı not alın.

+1

Cevabınız için teşekkür ederiz! Birkaç şeyi değiştirmek zorunda kaldım, ama işe yaratabilmek için bana mantığı verdin. İşte benim Jsfiddle kodum: [link] (http://jsfiddle.net/dzzNc/). En iyi yol olup olmadığını bilmiyorum ama denemeye değerdi. En zor kısım, özellikle "d" ve "i" olduğunda neyin "ekleneceğini" bilmekti, fakat dikkate alınacak ana bölüm son geri dönüş ifadesi gibi görünüyor. – Maikeximu

+0

Ha, Fransızyalı! Bir .bartext sınıfı eklediğim nedeni, CSS'nizde değiştirmek istediğiniz stil özelliklerine erişmek daha kolay olmasıdır. Örneğin, kodunuzda metin-çapa çok iyi koyabilirsiniz: orta ve dolgu: CSS'nizde beyaz, böylece javascript'inden stil tanımlarınızı (daha çok bakış odaklı) ayırabilirsiniz (daha fazla veri odaklı, tabii ki stil, esas olarak burada olmayan bir veri işlevidir). Çok fazla baş ağrısından kurtardım! –