2014-02-12 40 views
0

我正在使用存儲在tsv文件中的數據創建d3.js的條形圖。我想在每個欄中插入一個文本。我該怎麼辦? 我甚至試過這個solution,但不起作用。在d3js圖表上添加文本 - 添加<text>元素

這裏是我的函數的代碼:

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

var formatPercent = d3.format(".0%"); 

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

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 + ")"); 


function visualize(file){ 
    d3.tsv(file, function(error, data) { 

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

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


     svg.append("g") 
      .attr("class", "x axis") 
      .attr("transform", "translate(0," + height + ")") 
      .call(xAxis); 

     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("weight"); 

     svg.selectAll(".bar") 
      .data(data) 
     .enter().append("rect").style("fill", function (d){return d.color;}) 
      .attr("class", "bar") 
      .attr("x", function(d) { return x(d.concept); }) 
      .attr("width", x.rangeBand()) 
      .attr("y", function(d) { return y(d.weight); }) 
      .attr("height", function(d) { return height - y(d.weight); }); 

     svg.selectAll("text") 
     .data(data) 
     .enter() 
     .append("text") 
     .text(function(d) { 
      return d.concept; 
     }) 
     .attr("text-anchor", "middle") 
     .attr("x", x) 
     .attr("y",y) 
     .attr("font-family", "sans-serif") 
     .attr("font-size", "11px") 
     .attr("fill", "white"); 

    }); 

} 
所有

我與文件TSV代碼在這裏:full code

+0

P.S.我改變了標題。當我第一次閱讀「在文本里面插入文本」時,我預料到問題在於你實際上試圖將文本添加爲​​矩形的子元素(例如在HTML中添加一個跨度的div),這是混淆的另一個來源爲d3/svg初學者。 – AmeliaBR

回答

2

AmeliaBR是對像往常一樣,和我只是把這個答案,因爲雖然我的工作就可以了,我看到了我自己,使其真正改變代碼使用Enter,Update,Exit選擇範例。在這方面我做了很多改變。下面是代碼,FWIW:

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

var formatPercent = d3.format(".0%"); 

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

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 + ")"); 

svg.append("g") 
    .attr("class", "x axis") 
    .attr("transform", "translate(0," + height + ")") 
    .call(xAxis); 

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("weight"); 

var g = svg.append("g"); 

function update(file){ 
d3.tsv(file, function(error, data) { 

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

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

var bar = g.selectAll(".bar") 
    .data(data); 

bar.enter() 
    .append("rect") 
    .attr("class","bar"); 

bar 
    .style("fill", function (d){return d.color;}) 
    .attr("class", "bar") 
    .attr("x", function(d) { return x(d.concept); }) 
    .attr("width", x.rangeBand()) 
    .attr("y", function(d) { return y(d.weight); }) 
    .attr("height", function(d) { return height - y(d.weight); }); 

bar.exit().remove(); 

var text = g.selectAll(".text") 
    .data(data); 

text.enter() 
    .append("text") 
    .attr("class","text"); 

text 
    .attr("text-anchor", "right") 
    .attr("x", function(d) { return x(d.concept); }) 
    .attr("y", function(d) { return y(d.weight) + 22;}) 
    .attr("font-family", "sans-serif") 
    .attr("font-size", "11px") 
    .attr("fill", "white") 
    .text(function(d) { 
    return d.concept; 
}); 

text.exit().remove(); 
}); 
} 

你做update("data16.tsv")然後update("data15.tsv")這樣稱呼它。

0

當你畫一個軸,它創造了裏面的每個標籤單獨<text>元素SVG內部的軸組。因此,如果您嘗試選擇SVG中的所有<text>元素,則要選擇所有軸標籤。如果您的軸標籤多於文本元素的數據,則您的enter()選擇將爲空,並且不會發生任何情況。

爲了確保您只選擇了正確的<text>元素,請給文本標籤一個類來區分它們與軸標籤。然後使用這個類來縮小您的選擇:

svg.selectAll("text.bar-label") 
    .data(data) 
    .enter() 
    .append("text") 
    .attr("class", "bar-label") 
+0

對不起。我想要這種行爲http://alignedleft.com/content/03-tutorials/01-d3/130-making-a-bar-chart/18.png。用你的代碼修改軸標籤 –