2013-08-05 3 views
10

Я прочитал много документации о добавлении метки на гистограмме D3, но я не могу понять это. Я застрял в том, что добавить после «svg.selectAll (« текст »)».Добавление метки на гистограмме D3

Результат будет просто так же, как в этом примере:

enter image description here

Вот код:

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

}); 

Спасибо заранее. Я надеюсь, что это удержит его :)

ответ

14

Это должно сработать!

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

Обратите внимание, как я использую класс (.bartext) для идентификации ярлыков диаграмм.

+1

Спасибо за ваш ответ! Мне пришлось изменить несколько вещей, но вы дали мне логику, чтобы заставить ее работать. Вот мой код на Jsfiddle: [link] (http://jsfiddle.net/dzzNc/). Я не знаю, если это лучший способ, но стоит попробовать. Самая сложная часть заключалась в том, чтобы знать, что «добавить», особенно когда у вас есть «d» и «i», но основная часть, которую следует рассмотреть, представляется последним оператором return. – Maikeximu

+0

Ха, француз тоже! Причина, по которой я добавил класс .bartext, состоит в том, что тогда легче получить доступ к атрибутам стиля, которые вы хотите изменить в своем CSS. Например, в вашем коде вы могли бы разместить текстовое ядро: middle и fill: white в вашем CSS, тем самым отделяя ваши определения стиля (более ориентированные на точки зрения) от вашего javascript (более ориентированные на данные, если, конечно, вы не хотите, чтобы ваши стиль должен быть функцией данных, что в основном не имеет места здесь). Спасли меня от многих головных болей! –

Смежные вопросы