d3/examples/donut/donut.html

119 строки
2.7 KiB
HTML
Исходник Обычный вид История

<!DOCTYPE html>
2012-10-12 03:34:17 +04:00
<meta charset="utf-8">
<title>Donut Chart</title>
<style>
2010-09-28 22:34:52 +04:00
body {
font: 10px sans-serif;
}
2012-10-12 03:34:17 +04:00
</style>
<body>
<script src="../../d3.js"></script>
<script>
2010-09-28 22:34:52 +04:00
2012-04-06 14:47:11 +04:00
var width = 400,
height = 400,
outerRadius = Math.min(width, height) / 2,
innerRadius = outerRadius * .6,
2010-10-25 03:15:43 +04:00
n = 10,
q = 0,
data0 = d3.range(n).map(Math.random),
data1 = d3.range(n).map(Math.random),
data,
color = d3.scale.category20(),
arc = d3.svg.arc(),
donut = d3.layout.pie().sort(null);
2010-09-28 22:34:52 +04:00
2012-10-12 03:34:17 +04:00
var svg = d3.select("body").append("svg")
2012-04-06 14:47:11 +04:00
.attr("width", width)
.attr("height", height);
2010-09-28 22:34:52 +04:00
2012-10-12 03:34:17 +04:00
svg.selectAll(".arc")
.data(arcs(data0, data1))
.enter().append("g")
2010-09-28 22:34:52 +04:00
.attr("class", "arc")
2012-04-06 14:47:11 +04:00
.attr("transform", "translate(" + outerRadius + "," + outerRadius + ")")
.append("path")
2010-10-25 03:15:43 +04:00
.attr("fill", function(d, i) { return color(i); })
2010-09-28 22:34:52 +04:00
.attr("d", arc);
2012-10-12 03:34:17 +04:00
d3.select(window).on("keypress", swap);
2010-10-24 21:39:34 +04:00
function arcs(data0, data1) {
var arcs0 = donut(data0),
arcs1 = donut(data1),
i = -1,
arc;
while (++i < n) {
arc = arcs0[i];
2012-04-06 14:47:11 +04:00
arc.innerRadius = innerRadius;
arc.outerRadius = outerRadius;
arc.next = arcs1[i];
}
return arcs0;
}
function swap() {
2012-10-12 03:34:17 +04:00
d3.selectAll(".arc > path")
.data(++q & 1 ? arcs(data0, data1) : arcs(data1, data0))
2010-10-24 21:39:34 +04:00
.each(transitionSplit);
}
// 1. Wedges split into two rings.
function transitionSplit(d, i) {
d3.select(this)
.transition().duration(1000)
.attrTween("d", tweenArc({
2012-04-06 14:47:11 +04:00
innerRadius: i & 1 ? innerRadius : (innerRadius + outerRadius) / 2,
outerRadius: i & 1 ? (innerRadius + outerRadius) / 2 : outerRadius
2010-10-24 21:39:34 +04:00
}))
.each("end", transitionRotate);
2010-10-24 21:39:34 +04:00
}
// 2. Wedges translate to be centered on their final position.
function transitionRotate(d, i) {
var a0 = d.next.startAngle + d.next.endAngle,
a1 = d.startAngle - d.endAngle;
d3.select(this)
.transition().duration(1000)
.attrTween("d", tweenArc({
2010-10-24 21:39:34 +04:00
startAngle: (a0 + a1) / 2,
endAngle: (a0 - a1) / 2
}))
.each("end", transitionResize);
2010-10-24 21:39:34 +04:00
}
// 3. Wedges then update their values, changing size.
function transitionResize(d, i) {
d3.select(this)
.transition().duration(1000)
.attrTween("d", tweenArc({
2010-09-28 22:34:52 +04:00
startAngle: d.next.startAngle,
endAngle: d.next.endAngle
2010-10-24 21:39:34 +04:00
}))
.each("end", transitionUnite);
2010-10-24 21:39:34 +04:00
}
// 4. Wedges reunite into a single ring.
function transitionUnite(d, i) {
d3.select(this)
.transition().duration(1000)
.attrTween("d", tweenArc({
2012-04-06 14:47:11 +04:00
innerRadius: innerRadius,
outerRadius: outerRadius
2010-10-24 21:39:34 +04:00
}));
}
2010-09-28 22:34:52 +04:00
function tweenArc(b) {
2010-10-24 21:39:34 +04:00
return function(a) {
var i = d3.interpolate(a, b);
2010-10-24 21:39:34 +04:00
for (var key in b) a[key] = b[key]; // update data
return function(t) {
return arc(i(t));
};
};
2010-09-28 22:34:52 +04:00
}
2012-10-12 03:34:17 +04:00
</script>