source: Dev/branches/jQueryUI/client/d3/examples/donut/donut.html @ 275

Last change on this file since 275 was 249, checked in by hendrikvanantwerpen, 13 years ago

This one's for Subversion, because it's so close...

First widget (stripped down sequencer).
Seperated client and server code in two direcotry trees.

File size: 2.8 KB
Line 
1<!DOCTYPE html>
2<html>
3  <head>
4    <title>Donut Chart</title>
5    <script type="text/javascript" src="../../d3.js"></script>
6    <script type="text/javascript" src="../../d3.layout.js"></script>
7    <style type="text/css">
8
9body {
10  font: 10px sans-serif;
11}
12
13    </style>
14  </head>
15  <body>
16    <script type="text/javascript">
17
18var w = 400,
19    h = 400,
20    r1 = Math.min(w, h) / 2,
21    r0 = r1 * .6,
22    n = 10,
23    q = 0,
24    data0 = d3.range(n).map(Math.random),
25    data1 = d3.range(n).map(Math.random),
26    data,
27    color = d3.scale.category20(),
28    arc = d3.svg.arc(),
29    donut = d3.layout.pie();
30
31var vis = d3.select("body")
32  .append("svg:svg")
33    .attr("width", w)
34    .attr("height", h);
35
36vis.selectAll("g.arc")
37    .data(arcs(data0, data1))
38  .enter().append("svg:g")
39    .attr("class", "arc")
40    .attr("transform", "translate(" + r1 + "," + r1 + ")")
41  .append("svg:path")
42    .attr("fill", function(d, i) { return color(i); })
43    .attr("d", arc);
44
45window.addEventListener("keypress", swap, false);
46
47function arcs(data0, data1) {
48  var arcs0 = donut(data0),
49      arcs1 = donut(data1),
50      i = -1,
51      arc;
52  while (++i < n) {
53    arc = arcs0[i];
54    arc.innerRadius = r0;
55    arc.outerRadius = r1;
56    arc.next = arcs1[i];
57  }
58  return arcs0;
59}
60
61function swap() {
62  d3.selectAll("g.arc > path")
63      .data(++q & 1 ? arcs(data0, data1) : arcs(data1, data0))
64      .each(transitionSplit);
65}
66
67// 1. Wedges split into two rings.
68function transitionSplit(d, i) {
69  d3.select(this)
70    .transition().duration(1000)
71      .attrTween("d", tweenArc({
72        innerRadius: i & 1 ? r0 : (r0 + r1) / 2,
73        outerRadius: i & 1 ? (r0 + r1) / 2 : r1
74      }))
75      .each("end", transitionRotate);
76}
77
78// 2. Wedges translate to be centered on their final position.
79function transitionRotate(d, i) {
80  var a0 = d.next.startAngle + d.next.endAngle,
81      a1 = d.startAngle - d.endAngle;
82  d3.select(this)
83    .transition().duration(1000)
84      .attrTween("d", tweenArc({
85        startAngle: (a0 + a1) / 2,
86        endAngle: (a0 - a1) / 2
87      }))
88      .each("end", transitionResize);
89}
90
91// 3. Wedges then update their values, changing size.
92function transitionResize(d, i) {
93  d3.select(this)
94    .transition().duration(1000)
95      .attrTween("d", tweenArc({
96        startAngle: d.next.startAngle,
97        endAngle: d.next.endAngle
98      }))
99      .each("end", transitionUnite);
100}
101
102// 4. Wedges reunite into a single ring.
103function transitionUnite(d, i) {
104  d3.select(this)
105    .transition().duration(1000)
106      .attrTween("d", tweenArc({
107        innerRadius: r0,
108        outerRadius: r1
109      }));
110}
111
112function tweenArc(b) {
113  return function(a) {
114    var i = d3.interpolate(a, b);
115    for (var key in b) a[key] = b[key]; // update data
116    return function(t) {
117      return arc(i(t));
118    };
119  };
120}
121
122    </script>
123  </body>
124</html>
Note: See TracBrowser for help on using the repository browser.