import {Transform, stableCompare} from 'vega-dataflow'; import {inherits, one} from 'vega-util'; var Zero = 'zero', Center = 'center', Normalize = 'normalize', DefOutput = ['y0', 'y1']; /** * Stack layout for visualization elements. * @constructor * @param {object} params - The parameters for this operator. * @param {function(object): *} params.field - The value field to stack. * @param {Array} [params.groupby] - An array of accessors to groupby. * @param {function(object,object): number} [params.sort] - A comparator for stack sorting. * @param {string} [offset='zero'] - Stack baseline offset. One of 'zero', 'center', 'normalize'. */ export default function Stack(params) { Transform.call(this, null, params); } Stack.Definition = { 'type': 'Stack', 'metadata': {'modifies': true}, 'params': [ { 'name': 'field', 'type': 'field' }, { 'name': 'groupby', 'type': 'field', 'array': true }, { 'name': 'sort', 'type': 'compare' }, { 'name': 'offset', 'type': 'enum', 'default': Zero, 'values': [Zero, Center, Normalize] }, { 'name': 'as', 'type': 'string', 'array': true, 'length': 2, 'default': DefOutput } ] }; var prototype = inherits(Stack, Transform); prototype.transform = function(_, pulse) { var as = _.as || DefOutput, y0 = as[0], y1 = as[1], sort = stableCompare(_.sort), field = _.field || one, stack = _.offset === Center ? stackCenter : _.offset === Normalize ? stackNormalize : stackZero, groups, i, n, max; // partition, sum, and sort the stack groups groups = partition(pulse.source, _.groupby, sort, field); // compute stack layouts per group for (i=0, n=groups.length, max=groups.max; i max) max = s; if (sort) g.sort(sort); } groups.max = max; return groups; }