1 | d3.layout.pie = function() { |
---|
2 | var value = Number, |
---|
3 | sort = null, |
---|
4 | startAngle = 0, |
---|
5 | endAngle = 2 * Math.PI; |
---|
6 | |
---|
7 | function pie(data, i) { |
---|
8 | |
---|
9 | // Compute the start angle. |
---|
10 | var a = +(typeof startAngle === "function" |
---|
11 | ? startAngle.apply(this, arguments) |
---|
12 | : startAngle); |
---|
13 | |
---|
14 | // Compute the angular range (end - start). |
---|
15 | var k = (typeof endAngle === "function" |
---|
16 | ? endAngle.apply(this, arguments) |
---|
17 | : endAngle) - startAngle; |
---|
18 | |
---|
19 | // Optionally sort the data. |
---|
20 | var index = d3.range(data.length); |
---|
21 | if (sort != null) index.sort(function(i, j) { |
---|
22 | return sort(data[i], data[j]); |
---|
23 | }); |
---|
24 | |
---|
25 | // Compute the numeric values for each data element. |
---|
26 | var values = data.map(value); |
---|
27 | |
---|
28 | // Convert k into a scale factor from value to angle, using the sum. |
---|
29 | k /= values.reduce(function(p, d) { return p + d; }, 0); |
---|
30 | |
---|
31 | // Compute the arcs! |
---|
32 | var arcs = index.map(function(i) { |
---|
33 | return { |
---|
34 | data: data[i], |
---|
35 | value: d = values[i], |
---|
36 | startAngle: a, |
---|
37 | endAngle: a += d * k |
---|
38 | }; |
---|
39 | }); |
---|
40 | |
---|
41 | // Return the arcs in the original data's order. |
---|
42 | return data.map(function(d, i) { |
---|
43 | return arcs[index[i]]; |
---|
44 | }); |
---|
45 | } |
---|
46 | |
---|
47 | /** |
---|
48 | * Specifies the value function *x*, which returns a nonnegative numeric value |
---|
49 | * for each datum. The default value function is `Number`. The value function |
---|
50 | * is passed two arguments: the current datum and the current index. |
---|
51 | */ |
---|
52 | pie.value = function(x) { |
---|
53 | if (!arguments.length) return value; |
---|
54 | value = x; |
---|
55 | return pie; |
---|
56 | }; |
---|
57 | |
---|
58 | /** |
---|
59 | * Specifies a sort comparison operator *x*. The comparator is passed two data |
---|
60 | * elements from the data array, a and b; it returns a negative value if a is |
---|
61 | * less than b, a positive value if a is greater than b, and zero if a equals |
---|
62 | * b. |
---|
63 | */ |
---|
64 | pie.sort = function(x) { |
---|
65 | if (!arguments.length) return sort; |
---|
66 | sort = x; |
---|
67 | return pie; |
---|
68 | }; |
---|
69 | |
---|
70 | /** |
---|
71 | * Specifies the overall start angle of the pie chart. Defaults to 0. The |
---|
72 | * start angle can be specified either as a constant or as a function; in the |
---|
73 | * case of a function, it is evaluated once per array (as opposed to per |
---|
74 | * element). |
---|
75 | */ |
---|
76 | pie.startAngle = function(x) { |
---|
77 | if (!arguments.length) return startAngle; |
---|
78 | startAngle = x; |
---|
79 | return pie; |
---|
80 | }; |
---|
81 | |
---|
82 | /** |
---|
83 | * Specifies the overall end angle of the pie chart. Defaults to 2Ï. The |
---|
84 | * end angle can be specified either as a constant or as a function; in the |
---|
85 | * case of a function, it is evaluated once per array (as opposed to per |
---|
86 | * element). |
---|
87 | */ |
---|
88 | pie.endAngle = function(x) { |
---|
89 | if (!arguments.length) return endAngle; |
---|
90 | endAngle = x; |
---|
91 | return pie; |
---|
92 | }; |
---|
93 | |
---|
94 | return pie; |
---|
95 | }; |
---|