2013-02-08 92 views
10

如何將圖例添加到多行系列圖表中?我試過,但沒有得到任何圖例顯示。d3.js將圖例添加到多行系列圖表

的這裏塊:

http://bl.ocks.org/3884955

有一個缺陷,當各種系列匯聚到同一點,像零。所有的標籤都會疊加在一起。傳統的傳說將非常有用,而不是去尋找這些標籤。

我嘗試添加該

var legend = svg.append("g") 
.attr("class", "legend") 
.attr("height", 100) 
.attr("width", 100) 
.attr('transform', 'translate(-20,50)');  

legend.selectAll('rect') 
    .datum(function(d) { return {name: d.name, value: d.values[d.values.length - 1]}; }) 
    .append("rect") 
    .attr("x", width) 
    .attr("y", function(d, i){ return i * 20;}) 
    .attr("width", 10) 
    .attr("height", 10) 
    .style("fill", function(d) { 
    return color.domain(d3.keys(d[0]).filter(function(key) { return key !== "day"; })); 
    }); 

legend.selectAll('text') 
    .datum(function(d) { return {name: d.name, value: d.values[d.values.length - 1]}; }) 
    .append("text") 
    .attr("x", width) 
    .attr("y", function(d, i){ return i * 20 + 9;}) 
    .text(function(d) { 
    return d.name; 
    }); 

到代碼的末尾,我的數據是如何格式化的鍵值名(d.name)匹配,但它並不顯示。在一個點上它顯示全黑盒子到圖形的右側,這樣意味着我接近,但我缺少一些重要的東西

任何見解讚賞

回答

13

Here是你的代碼的固定&重構版本。

var legend = svg.selectAll('g') 
     .data(cities) 
     .enter() 
     .append('g') 
     .attr('class', 'legend'); 

    legend.append('rect') 
     .attr('x', width - 20) 
     .attr('y', function(d, i){ return i * 20;}) 
     .attr('width', 10) 
     .attr('height', 10) 
     .style('fill', function(d) { 
      return color(d.name); 
     }); 

    legend.append('text') 
     .attr('x', width - 8) 
     .attr('y', function(d, i){ return (i * 20) + 9;}) 
     .text(function(d){ return d.name; }); 

您需要使用enter(),但enter()exit()方法不能datum()使用。從d3 wiki

selection.datum引用([值])

獲取或設置綁定的數據爲每個選定的元素。與selection.data方法不同,此方法不計算連接(因此不計算進入和退出選擇)。

+1

我添加了一個點,並且您的代碼適用於我。 var legend = svg.selectAll('。g') – theIrishUser 2014-03-05 14:22:13

0

你似乎缺少.datum後。進入() ()函數調用。

legend.selectAll('rect') 

    .datum(function(d) { return {name: d.name, value: d.values[d.values.length - 1]}; }) 

    .enter() // <====== 

    .append("rect") 

    .attr("x", width) 

    .attr("y", function(d, i){ return i * 20;}) 

    .attr("width", 10) 

    .attr("height", 10) 

    .style("fill", function(d) { 

    return color.domain(d3.keys(d[0]).filter(function(key) { return key !== "day"; })); 

追加「矩形」之前,你必須使用輸入()函數見鏈接,確切的解釋Click Here

+0

hm,我發現一些與邏輯有差異的地方,在一些地方的'city'變量以'.append(「text」)''開頭,然後是'.datum(...)'之後輸入(),但只是屬性修改。此外,當我添加'輸入()'我的控制檯說,對象沒有'輸入()',並給了一個錯誤 – CQM 2013-02-08 20:36:37

+0

我可能是錯的,但我認爲混淆來自事實(如果我正確閱讀).datum ()將值添加/更改爲選擇中的現有元素。在您的代碼中,您聲明「legend.selectAll('rect')」不存在,並且要創建初始連接,您需要使用「.data(data).enter()」創建新的「rect」元素。 – 2013-02-08 22:27:42

+0

這裏是一個很好的答案關於.data和.datum的問題http://stackoverflow.com/questions/13181194/when-do-i-need-to-use-or-not-use-datum-when-appending- an-svg-element – 2013-02-08 22:30:55