@antv/g2plot
Version:
G2 Plot, a market of plots built with the Grammar of Graphics'
46 lines • 1.91 kB
JavaScript
import { __assign } from "tslib";
import { groupBy, mapValues, map, flatten, isNumber, reduce, each } from '@antv/util';
export var transformDataPercentage = function (data, groupField, measures) {
// 按照groupBy字段计算各个group的总和
var chain = groupBy(data, groupField);
chain = mapValues(chain, function (items) { return map(items, function (item) { return map(measures, function (field) { return item[field]; }); }); });
chain = mapValues(chain, flatten);
chain = mapValues(chain, function (vals) {
return map(vals, function (val) {
// @ts-ignore
var v = Number.parseFloat(val);
if (!isNumber(v) || isNaN(v)) {
return 0;
}
return v;
});
});
// @ts-ignore
var groupTotals = mapValues(chain, function (vals) { return reduce(vals, function (sum, val) { return sum + val; }, 0); });
// 覆盖measures字段的值为对于的百分比
var newData = map(data, function (item) {
var rst = __assign(__assign({}, item), { _origin: item, total: groupTotals[item[groupField]] });
each(measures, function (field) {
// @ts-ignore
rst[field] = item[field] / groupTotals[item[groupField]];
});
return rst;
});
// 检查精度,确保总和为1
each(groupBy(newData, groupField), function (items) {
var sum = 0;
each(items, function (item, itemIdx) {
each(measures, function (field, fieldIdx) {
// @ts-ignore
if (sum + item[field] >= 1 || (itemIdx === items.length - 1 && fieldIdx === measures.length - 1)) {
item[field] = 1 - sum;
}
// @ts-ignore
sum += item[field];
});
});
});
// @ts-ignore
return newData;
};
//# sourceMappingURL=data.js.map