2012-11-01 74 views
2

我已將餅圖示例擴展爲: ,餅圖的半徑因百分比而異。我想每20%添加一個網格線(圈),但我無法弄清楚如何。D3.JS - 如何將網格線添加到我的餅圖

這裏是更新CSV:

年齡,人口,百分之 < 5,2704659,67 5-13,4499890,38 14-17,2159981,91 18-24,3853788,49 25-44,14106543,71 45-64,8819342,88 = 65,612463,64

,這裏是具有不同半徑的餅狀部分更新後的代碼:

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

body { 
    font: 10px sans-serif; 
    background: #333; 
} 

.arc path { 
    stroke: #fff; 
    stroke-width: 2px; 
} 

.arc grid { 
    stroke: #fff; 
    stroke-width: 1; 
    stroke-dasharray: 5,5; 
} 

.arc text { 
    fill:#fff; 
    font-size:12px; 
    font-weight:bold; 
} 

.arc line { 
    stroke: #fff; 
} 

</style> 
<body> 
<script src="d3.js"></script> 
<script> 

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

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

var arc = d3.svg.arc() 
    .outerRadius(function(d) { return 50 + (radius - 50) * d.data.percent/100; }) 
    .innerRadius(20); 

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

var grid = d3.svg.area.radial() 
    .radius(150); 

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

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

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

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

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

}); 

</script> 

回答

1

首先設置蜱數量:

var numTicks = 5; // Each tick is 20% 

然後創建數據來創建網格線:

var sdat = []; 
for (i=0; i<=numTicks; i++) { 
    sdat[i] = (radius/numTicks) * i; 
} 

然後你可以使用一個函數來創建徑向網格線,你可以叫它從d3.csv塊內:

addCircleAxes = function() { 
    var circleAxes, i; 

    svg.selectAll('.circle-ticks').remove(); 

    circleAxes = svg.selectAll('.circle-ticks') 
     .data(sdat) 
     .enter().append('svg:g') 
     .attr("class", "circle-ticks"); 

    // radial tick lines 
    circleAxes.append("svg:circle") 
     .attr("r", String) 
     .attr("class", "circle") 
     .style("stroke", "#CCC") 
     .style("opacity", 0.5) 
     .style("fill", "none"); 

    // Labels for each circle 
    circleAxes.append("svg:text") 
     .attr("text-anchor", "center") 
     .attr("dy", function(d) { return d - 5 }) 
     .style("fill", "#fff") 
     .text(function(d,i) { return i * (100/numTicks) }); 

}; 

一個例子是在這裏:http://bl.ocks.org/3994129

(借來自:http://kreese.net/blog/2012/08/26/d3-js-creating-a-polar-area-diagram-radial-bar-chart/