2013-08-05 14 views
10

Ich lese eine Menge Dokumentation über das Hinzufügen von Etiketten auf einem D3-Balkendiagramm, aber ich kann es nicht herausfinden. Ich bin fest, was nach dem "svg.selectAll (" text ")" hinzuzufügen.Hinzufügen eines Etiketts auf einem D3-Balkendiagramm

Das Ergebnis wäre genau das gleiche wie in diesem Beispiel:

enter image description here

Hier ist der Code:

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") 
    //???? // 

}); 

Danke im Voraus. Ich hoffe, es in den Griff zu bekommen :)

Antwort

14

Dies sollte funktionieren!

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; 
}); 

Beachten Sie, wie ich eine Klasse (.Bartext) verwenden, um die Diagrammbeschriftungen zu identifizieren.

+1

Vielen Dank für Ihre Antwort! Ich musste ein paar Dinge ändern, aber du hast mir die Logik gegeben, damit es funktioniert. Hier ist mein Code auf Jsfiddle: [link] (http://jsfiddle.net/dzzNc/). Ich weiß nicht, ob es der beste Weg ist, aber es war einen Versuch wert. Der schwierigste Teil war, zu wissen, was man "hinzufügt", besonders wenn man "d" und "i" hat, aber der Hauptteil, den man in Betracht zieht, scheint die letzte Rückmeldung zu sein. – Maikeximu

+0

Ha, Franzose auch! Der Grund, warum ich eine .bartext-Klasse hinzugefügt habe, liegt darin, dass es einfacher ist, auf die Stilattribute zuzugreifen, die Sie in Ihrem CSS ändern möchten. In Ihrem Code könnten Sie zum Beispiel text-anchor: middle und fill: white in Ihr CSS einfügen und damit Ihre Stildefinitionen (die mehr auf die Sichtweise ausgerichtet sind) von Ihrem Javascript (mehr datenorientiert, außer natürlich, wenn Sie möchten Stil eine Funktion der Daten sein, was hier hauptsächlich nicht der Fall ist). Rettete mich vor vielen Kopfschmerzen! –

Verwandte Themen