UNPKG

@visactor/vgrammar-core

Version:

VGrammar is a visual grammar library

75 lines (71 loc) 4.49 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.transform = void 0; const vgrammar_util_1 = require("@visactor/vgrammar-util"), differ_1 = require("../../graph/mark/differ"), stack = (options, data) => { var _a; const positiveValues = new Map, negativeValues = new Map, offset = null !== (_a = options.offset) && void 0 !== _a ? _a : "diverging"; return data.map((datum => { var _a; const dimension = datum[options.dimensionField], stackValue = "diverging" === offset ? datum[options.stackField] : Math.abs(datum[options.stackField]), map = stackValue >= 0 ? positiveValues : negativeValues, lastValue = null !== (_a = map.get(dimension)) && void 0 !== _a ? _a : 0, value = stackValue + lastValue; return map.set(dimension, value), { dimension: dimension, value: stackValue, stack: value, prevStack: lastValue, datum: datum }; })); }, silhouetteOffset = (options, data) => { if (!data || 0 === data.length) return data; const groupedData = (0, differ_1.groupData)(data, (0, vgrammar_util_1.field)("dimension")); return groupedData.keys.forEach((key => { const dimensionData = groupedData.data.get(key); if (!dimensionData || dimensionData.length <= 0) return 0; const g0 = -dimensionData.reduce(((sum, entry) => sum + entry.value), 0) / 2; dimensionData.forEach((datum => { datum.stack = datum.stack + g0, datum.prevStack = datum.prevStack + g0; })); })), data; }, wiggleOffset = (options, data) => { if (!data || 0 === data.length) return data; const groupedData = (0, differ_1.groupData)(data, (0, vgrammar_util_1.field)("dimension")); return groupedData.keys.forEach((key => { const dimensionData = groupedData.data.get(key); if (!dimensionData || dimensionData.length <= 0) return 0; const n = dimensionData.length, g0 = -1 / (n + 1) * dimensionData.reduce(((sum, entry, i) => entry.value * (n - i + 1)), 0); dimensionData.forEach((datum => { datum.stack = datum.stack + g0, datum.prevStack = datum.prevStack + g0; })); })), data; }, setFields = (options, data) => { if (!(options.asPercentStack || options.asPrevPercentStack || options.asPercent || options.asSum)) return data.map((entry => { var _a; const {stack: stack, prevStack: prevStack, datum: datum} = entry, newDatum = Object.assign({}, datum); return newDatum[null !== (_a = options.asStack) && void 0 !== _a ? _a : options.stackField] = stack, options.asPrevStack && (newDatum[options.asPrevStack] = prevStack), newDatum; })); const positiveSums = new Map, negativeSums = new Map; return data.forEach((entry => { var _a; const {dimension: dimension, value: value} = entry, map = value >= 0 ? positiveSums : negativeSums; map.set(dimension, (null !== (_a = map.get(dimension)) && void 0 !== _a ? _a : 0) + value); })), data.map((entry => { var _a, _b; const {dimension: dimension, value: value, stack: stack, prevStack: prevStack, datum: datum} = entry, newDatum = Object.assign({}, datum), sum = null !== (_a = (value >= 0 ? positiveSums : negativeSums).get(dimension)) && void 0 !== _a ? _a : 0; return newDatum[null !== (_b = options.asStack) && void 0 !== _b ? _b : options.stackField] = stack, options.asPrevStack && (newDatum[options.asPrevStack] = prevStack), options.asSum && (newDatum[options.asSum] = sum), options.asPercent && (newDatum[options.asPercent] = 0 === sum ? 0 : value / sum), options.asPercentStack && (newDatum[options.asPercentStack] = 0 === sum ? 0 : stack / sum), options.asPrevPercentStack && (newDatum[options.asPrevPercentStack] = 0 === sum ? 0 : prevStack / sum), newDatum; })); }, transform = (options, upstreamData) => { var _a; const offset = null !== (_a = options.offset) && void 0 !== _a ? _a : "diverging", data = "negative" === options.order ? upstreamData.slice().reverse() : upstreamData, stackedValues = stack(options, data); "silhouette" === offset ? silhouetteOffset(0, stackedValues) : "wiggle" === offset && wiggleOffset(0, stackedValues); const output = setFields(options, stackedValues); return "negative" === options.order ? output.reverse() : output; }; exports.transform = transform; //# sourceMappingURL=stack.js.map