UNPKG

1.89 kBJavaScriptView Raw
1import {Transform} from 'vega-dataflow';
2import {inherits, one} from 'vega-util';
3import {range, sum} from 'd3-array';
4
5/**
6 * Pie and donut chart layout.
7 * @constructor
8 * @param {object} params - The parameters for this operator.
9 * @param {function(object): *} params.field - The value field to size pie segments.
10 * @param {number} [params.startAngle=0] - The start angle (in radians) of the layout.
11 * @param {number} [params.endAngle=2π] - The end angle (in radians) of the layout.
12 * @param {boolean} [params.sort] - Boolean flag for sorting sectors by value.
13 */
14export default function Pie(params) {
15 Transform.call(this, null, params);
16}
17
18Pie.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
30var prototype = inherits(Pie, Transform);
31
32prototype.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};