4
<title>Donut Chart</title>
5
<script type="text/javascript" src="../../d3.v2.js"></script>
6
<style type="text/css">
15
<script type="text/javascript">
19
outerRadius = Math.min(width, height) / 2,
20
innerRadius = outerRadius * .6,
23
data0 = d3.range(n).map(Math.random),
24
data1 = d3.range(n).map(Math.random),
26
color = d3.scale.category20(),
28
donut = d3.layout.pie().sort(null);
30
var vis = d3.select("body")
33
.attr("height", height);
35
vis.selectAll("g.arc")
36
.data(arcs(data0, data1))
39
.attr("transform", "translate(" + outerRadius + "," + outerRadius + ")")
41
.attr("fill", function(d, i) { return color(i); })
44
window.addEventListener("keypress", swap, false);
46
function arcs(data0, data1) {
47
var arcs0 = donut(data0),
53
arc.innerRadius = innerRadius;
54
arc.outerRadius = outerRadius;
61
d3.selectAll("g.arc > path")
62
.data(++q & 1 ? arcs(data0, data1) : arcs(data1, data0))
63
.each(transitionSplit);
66
// 1. Wedges split into two rings.
67
function transitionSplit(d, i) {
69
.transition().duration(1000)
70
.attrTween("d", tweenArc({
71
innerRadius: i & 1 ? innerRadius : (innerRadius + outerRadius) / 2,
72
outerRadius: i & 1 ? (innerRadius + outerRadius) / 2 : outerRadius
74
.each("end", transitionRotate);
77
// 2. Wedges translate to be centered on their final position.
78
function transitionRotate(d, i) {
79
var a0 = d.next.startAngle + d.next.endAngle,
80
a1 = d.startAngle - d.endAngle;
82
.transition().duration(1000)
83
.attrTween("d", tweenArc({
84
startAngle: (a0 + a1) / 2,
85
endAngle: (a0 - a1) / 2
87
.each("end", transitionResize);
90
// 3. Wedges then update their values, changing size.
91
function transitionResize(d, i) {
93
.transition().duration(1000)
94
.attrTween("d", tweenArc({
95
startAngle: d.next.startAngle,
96
endAngle: d.next.endAngle
98
.each("end", transitionUnite);
101
// 4. Wedges reunite into a single ring.
102
function transitionUnite(d, i) {
104
.transition().duration(1000)
105
.attrTween("d", tweenArc({
106
innerRadius: innerRadius,
107
outerRadius: outerRadius
111
function tweenArc(b) {
113
var i = d3.interpolate(a, b);
114
for (var key in b) a[key] = b[key]; // update data