2014-09-29 194 views
0

我正在研究d3.js餅圖應用程序。我正在嘗試開發一種功能,當您單擊圖例矩形時,它會切換開/關切片以及圖例矩形內的填充。d3.js餅圖圖例切片切換

http://jsfiddle.net/Qh9X5/3136/

傳說

Rects 
         .enter() 
         .append("rect") 
         .attr("x", w - 65) 
         .attr("y", function(d, i){ return i * 20;}) 
         .attr("width", 10) 
         .attr("height", 10) 
         .style("fill", function(d, i) { 
          return methods.color(i); 
         })       
         .style("stroke", function(d, i) { 
          return methods.color(i); 
         }) 
         .on('click', function(d, i){ 
          onLegendClick(d, i); 
         }) 
+0

'onLegendClick()'在做什麼?換句話說,你有什麼嘗試? – jshanley 2014-09-29 15:42:49

+0

我已經創建了該函數作爲起點。 – 2014-09-29 16:38:17

+0

你是什麼意思「切換開關」?你的意思是當你點擊圖例中的一種顏色時,餅圖上的其他顏色變得不透明,而選定的顏色保持亮度?像一個突出的效果? – aponysus 2014-09-29 18:19:18

回答

1

這裏是來解決問題的一種方法:在你的代碼中使用key functions需要被

一個變化,使得d過濾的數據匹配到相應的DOM節點。標籤似乎是您的數據集中的一個合適的關鍵。

只需使用:的

.data(this.piedata, function(d) { return d.data.label}); 

代替

.data(this.piedata); 

然後,在你OnLegendClick功能,要選擇所有傳奇的正確,而且所有的SVG弧線與點擊的元素匹配。

工作流程是:

  1. 選擇DOM元素
  2. 匹配與選擇的數據
  3. 應用更改

這裏是如何做到這一點:

function onLegendClick(dt){ 
    d3.selectAll('rect').data([dt], function(d) { return d.data.label}).style("opacity", function(d) {return Math.abs(1-d3.select(this).style("opacity"))}) 
    d3.selectAll('.pie').data([dt], function(d) { return d.data.label}).style("opacity", function(d) {return Math.abs(1-d3.select(this).style("opacity"))}) 
}  

我讓你調整「切換」f eature。除了弧線之外,您還可能想要更改文字,爲此可以使用其他選擇。

更新了jsfiddle:http://jsfiddle.net/Qh9X5/3138/

+0

這與我正在尋找的東西很接近 - 它更多的是關閉其他切片之間的間隙並使填充變透明的情況。 http://nvd3.org/examples/pie.html – 2014-09-30 09:40:15

+0

我試圖切換填充的rects - 但它沒有按照計劃工作,似乎一旦填充是沒有的 - 它不會再被點擊再次點擊 - http://jsfiddle.net/Qh9X5/3139/ – 2014-09-30 10:26:00

+1

關於你的第二個評論,你應該將填充不透明度轉換爲0,而不是將填充設置爲「無」。這樣你的矩形將保持點擊。 – 2014-09-30 13:04:03