var MAX_RADIUS = 4.5; var width = 500, height = 500, radius = Math.min(width, height) / 2, innerRadius = 0.3 * radius; var pie = d3.layout.pie() .sort(null) .value(function(d) { return d.width; }) ; var tip = d3.tip() .attr('class', 'd3-tip') .offset([0, 0]) .html(function(d) { return d.data.label + ": " + d.data.score + ""; }); var arc = d3.svg.arc() .innerRadius(innerRadius) .outerRadius(function (d) { return (radius - innerRadius) * ((d.data.score - 0.5) / MAX_RADIUS) + innerRadius; }); var outlineArc = d3.svg.arc() .innerRadius(innerRadius) .outerRadius(radius); var svg = d3.select("body").append("svg") .attr("width", width) .attr("height", height) .append("g") .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); svg.call(tip); d3.csv('aster_data.csv', function(error, data) { data.forEach(function(d) { d.id = d.id; d.order = +d.order; d.color = d.color; d.weight = +d.weight; d.score = +d.score; d.width = +d.weight; d.label = d.label; }); var path = svg.selectAll(".solidArc") .data(pie(data)) .enter().append("path") .attr("fill", function(d) { return d.data.color; }) .attr("class", "solidArc") .attr("stroke", "gray") .attr("d", arc) .on('mouseover', tip.show) .on('mouseout', tip.hide); var outerPath = svg.selectAll(".outlineArc") .data(pie(data)) .enter().append("path") .attr("fill", "none") .attr("stroke", "#eee") .attr("class", "outlineArc") .attr("d", outlineArc); // calculate the weighted mean score var score = data.reduce(function(a, b) { //console.log('a:' + a + ', b.score: ' + b.score + ', b.weight: ' + b.weight); return a + (b.score * b.weight); }, 0) / data.reduce(function(a, b) { return a + b.weight; }, 0); var formatDecimal = d3.format(".1f") svg.append("svg:text") .attr("class", "aster-score") .attr("dy", ".35em") .attr("text-anchor", "middle") // text-align: right .text(formatDecimal(score)); for (var i = 0; i < 10; i++) { var aradius = (radius - innerRadius) * (i / 2 / MAX_RADIUS) + innerRadius; var outerPath = svg.selectAll(".outlineArc" + i) .data(pie(data)) .enter().append("path") .attr("fill", "none") .attr("stroke", "#eee") .attr("class", "outlineArc") .attr("d", d3.svg.arc() .innerRadius(aradius) .outerRadius(aradius)); } svg.selectAll("text") .data(d3.range(1,9).reverse()) .enter().append("text") .attr("x", 4) .attr("y", function(d){return (radius - innerRadius) * (-(d-0.5 + 0.5) / MAX_RADIUS) - innerRadius;}) .attr("dy", "2em") .style("font-size", "18px") .style("font-weight", "bold") .attr("fill", "#666") .text(function (d) { return d3.format("f")(d); }); });