Skip to content

Instantly share code, notes, and snippets.

@parryc
Forked from mbostock/.block
Created December 8, 2012 20:06
Show Gist options
  • Save parryc/4241696 to your computer and use it in GitHub Desktop.
Save parryc/4241696 to your computer and use it in GitHub Desktop.
Pie Chart Mod

Test for random colored pie chart!

Pie chart data from here

<!DOCTYPE html>
<meta charset="utf-8">
<style>
body {
font: 10px sans-serif;
}
.arc path {
stroke: #fff;
}
</style>
<body>
<div id="pie1">Hi.</div>
<div id="pie2">TWO PIES</div>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="https://raw.github.com/bgrins/TinyColor/master/tinycolor.js"></script>
<script>
var data = [{"label" : "list 1", "value":500},
{"label" : "list 2", "value":300},
{"label" : "list 3", "value":400},
{"label" : "other", "value":200}];
var lists = 3;
var w = 960,
h = 500,
r = Math.min(w, h) / 2;
var colors = d3.scale.category20b().range();
var mainColorNum = Math.floor((Math.random()*5))*4+1;
var compColor = tinycolor.complement(colors[mainColorNum]);
var colorList = [];
for(var i = 0; i < lists; i++){
colorList.push(colors[mainColorNum+i]);
}
colorList.push(compColor);
var color = d3.scale.ordinal().range(colorList);
var vis = d3.select("#pie2")
.append("svg:svg") //create the SVG element inside the <body>
.data([data]) //associate our data with the document
.attr("width", w) //set the width and height of our visualization (these will be attributes of the <svg> tag
.attr("height", h)
.append("svg:g") //make a group to hold our pie chart
.attr("transform", "translate(" + r + "," + r + ")") //move the center of the pie chart from 0, 0 to radius, radius
var arc = d3.svg.arc() //this will create <path> elements for us using arc data
.outerRadius(r);
var pie = d3.layout.pie() //this will create arc data for us given a list of values
.value(function(d) { return d.value; }); //we must tell it out to access the value of each element in our data array
var arcs = vis.selectAll("g.slice") //this selects all <g> elements with class slice (there aren't any yet)
.data(pie) //associate the generated pie data (an array of arcs, each having startAngle, endAngle and value properties)
.enter() //this will create <g> elements for every "extra" data element that should be associated with a selection. The result is creating a <g> for every object in the data array
.append("svg:g") //create a group to hold each slice (we will have a <path> and a <text> element associated with each slice)
.attr("class", "slice"); //allow us to style things in the slices (like text)
arcs.append("svg:path")
.attr("fill", function(d, i) { return color(i); } ) //set the color for each slice to be chosen from the color function defined above
.attr("d", arc); //this creates the actual SVG path using the associated data (pie) with the arc drawing function
arcs.append("svg:text") //add a label to each slice
.attr("transform", function(d) { //set the label's origin to the center of the arc
//we have to make sure to set these before calling arc.centroid
d.innerRadius = 0;
d.outerRadius = r;
return "translate(" + arc.centroid(d) + ")"; //this gives us a pair of coordinates like [50, 50]
})
.attr("text-anchor", "middle") //center the text on it's origin
.text(function(d, i) { return data[i].label; }); //get the label from our original data array
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment