1 | import {Transform} from 'vega-dataflow';
|
2 | import {inherits, one} from 'vega-util';
|
3 | import {range, sum} from 'd3-array';
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | export default function Pie(params) {
|
15 | Transform.call(this, null, params);
|
16 | }
|
17 |
|
18 | Pie.Definition = {
|
19 | 'type': 'Pie',
|
20 | 'metadata': {'modifies': true},
|
21 | 'params': [
|
22 | { 'name': 'field', 'type': 'field' },
|
23 | { 'name': 'startAngle', 'type': 'number', 'default': 0 },
|
24 | { 'name': 'endAngle', 'type': 'number', 'default': 6.283185307179586 },
|
25 | { 'name': 'sort', 'type': 'boolean', 'default': false },
|
26 | { 'name': 'as', 'type': 'string', 'array': true, 'length': 2, 'default': ['startAngle', 'endAngle'] }
|
27 | ]
|
28 | };
|
29 |
|
30 | var prototype = inherits(Pie, Transform);
|
31 |
|
32 | prototype.transform = function(_, pulse) {
|
33 | var as = _.as || ['startAngle', 'endAngle'],
|
34 | startAngle = as[0],
|
35 | endAngle = as[1],
|
36 | field = _.field || one,
|
37 | start = _.startAngle || 0,
|
38 | stop = _.endAngle != null ? _.endAngle : 2 * Math.PI,
|
39 | data = pulse.source,
|
40 | values = data.map(field),
|
41 | n = values.length,
|
42 | a = start,
|
43 | k = (stop - start) / sum(values),
|
44 | index = range(n),
|
45 | i, t, v;
|
46 |
|
47 | if (_.sort) {
|
48 | index.sort(function(a, b) {
|
49 | return values[a] - values[b];
|
50 | });
|
51 | }
|
52 |
|
53 | for (i=0; i<n; ++i) {
|
54 | v = values[index[i]];
|
55 | t = data[index[i]];
|
56 | t[startAngle] = a;
|
57 | t[endAngle] = (a += v * k);
|
58 | }
|
59 |
|
60 | this.value = values;
|
61 | return pulse.reflow(_.modified()).modifies(as);
|
62 | };
|