2013-02-19 73 views
3

這是爲協議分發創建餅圖的基本代碼。在我的.csv文件中,我有兩列,即協議名稱和百分比。我想在各個弧上添加事件。例如,當我單擊包含TCP統計信息的弧時,它應該導致另一個頁面。請幫助我如何做到這一點。我能夠爲整個餅圖添加點擊事件。如何將事件添加到由d3.js創建的餅圖的各個部分(圓弧)?

<!DOCTYPE html> 
<meta charset="utf-8"> 
<style> 

body { 
    font: 10px sans-serif; 
} 

.arc path { 
    stroke: #fff; 
} 

</style> 
<body> 
<script src="http://d3js.org/d3.v3.min.js"></script> 
<script> 

var width = 960, 
    height = 500, 
    radius = Math.min(width, height)/2; 

var color = d3.scale.ordinal() 
    .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]); 

var arc = d3.svg.arc() 
    .outerRadius(radius - 10) 
    .innerRadius(0); 

var pie = d3.layout.pie() 
    .sort(null) 
    .value(function(d) { return d.count; }); 

var svg = d3.select("body").append("svg") 
    .attr("width", width) 
    .attr("height", height) 
    .append("g") 
    .attr("transform", "translate(" + width/2 + "," + height/2 + ")"); 

d3.csv("flow_count.csv", function(error, data) { 

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

    var g = svg.selectAll(".arc") 
     .data(pie(data)) 
    .enter().append("g") 
     .attr("class", "arc"); 

    g.append("path") 
     .attr("d", arc) 
     .style("fill", function(d) { return color(d.data.proto); }); 

    g.append("text") 
     .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; }) 
     .attr("dy", ".35em") 
     .style("text-anchor", "middle") 
     .text(function(d) { return d.data.proto; }); 
     g.on("click", function(d,i) { 
     window.location.href='index.html'; 
}) 

}); 

</script> 
+0

你確定這是正確的代碼,它看起來像這樣將借鑑?一個條形圖,而不是餅圖,就像你在說明中所說的那樣。 – 2013-02-19 22:42:42

+0

對不起,我錯誤地添加了條形圖的代碼,現在我編輯了它,並添加了點擊導致另一個頁面的功能。弄清楚如何在單個弧上添加事件而不是整個餅圖 – Konix 2013-02-20 05:26:12

+0

它看起來像g.on(「clicK」,...)被鏈接到個別弧,但他們都指向相同的頁面(index.html)。您需要重寫函數本身,以便重定向根據d或i而變化。 – 2013-02-20 11:28:43

回答

3

內「svg.selectAll(」酒吧「),你可以在點擊在線添加:

svg.selectAll(".bar") 
     .data(data) 
    .enter().append("rect") 
    .attr("class", "bar") 
     .attr("x", function(d) { return x(d.letter); }) 
     .attr("width", x.rangeBand()) 
     .attr("y", function(d) { return y(d.frequency); }) 
     .attr("height", function(d) { return height - y(d.frequency); }) 
     .on("click", function(d) { 
      // code you want executed on the click event 
     });