@antv/g2plot
Version:
G2 Plot, a market of plots built with the Grammar of Graphics'
101 lines • 3.46 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var _ = tslib_1.__importStar(require("@antv/util"));
var math_1 = require("../../math");
var unitMapper = {
k: { number: 1e3, index: 0 },
m: { number: 1e6, index: 1 },
b: { number: 1e9, index: 2 },
t: { number: 1e12, index: 3 },
};
// https://gist.github.com/MartinMuzatko/1060fe584d17c7b9ca6e
// https://jburrows.wordpress.com/2014/11/18/abbreviating-numbers/
/*tslint:disable*/
function digitsAbbreviate(shape, option, index, cfg) {
if (!_.has(cfg, 'node') || !_.has(cfg.node, 'node')) {
return;
}
var nodes = cfg.nodes.nodes;
var number = parseFloat(shape.get('origin').text);
if (number === 0) {
return;
}
if (option.formatter) {
shape.attr('text', option.formatter(number));
return;
}
if (option.unit) {
var _a = abbravateDigitsByUnit(option, number), num = _a.num, unitname = _a.unitname;
shape.attr('text', num + unitname);
}
else {
// 自动换算逻辑
// 根据中位数得到换算单位
var numbers = extractNumbers(nodes);
var median = math_1.getMedian(numbers);
var unitname = getUnitByNumber(median);
//根据数值的interval计算换算后保留的浮点数
var unitNumber = unitMapper[unitname].number;
var interval = getLinearNodesInterval(nodes);
var decimal = getDigitsDecimal(interval, unitNumber);
var num = abbravateDigitsByUnit({ unit: unitname, decimal: decimal }, number).num;
shape.attr('text', num + unitname);
}
}
exports.default = digitsAbbreviate;
function abbravateDigitsByUnit(option, number) {
var units = ['k', 'm', 'b', 't'];
var num;
var unitname;
if (option.unit === 'auto') {
/** auto formatt k-m-b-t */
var order = Math.floor(Math.log(number) / Math.log(1000));
unitname = units[order - 1];
num = (number / Math.pow(1000, order)).toFixed(option.decimal);
}
else if (option.unit) {
var unit = unitMapper[option.unit];
unitname = option.unit;
num = (number / unit.number).toFixed(option.decimal);
}
return { num: num, unitname: unitname };
}
function getUnitByNumber(number) {
var units = ['k', 'm', 'b', 't'];
var order = Math.floor(Math.log(number) / Math.log(1000));
return units[order - 1];
}
function extractNumbers(nodes) {
var numbers = [];
_.each(nodes, function (node) {
var n = node;
var number = parseFloat(n.shape.get('origin').text);
numbers.push(number);
});
return numbers;
}
function getLinearNodesInterval(nodes) {
if (nodes.length >= 2) {
var a = parseFloat(nodes[0].shape.get('origin').text);
var b = parseFloat(nodes[1].shape.get('origin').text);
return Math.abs(a - b);
}
return 0;
}
function getDigitsDecimal(interval, unitNumber) {
var unitBit = Math.floor(Math.log10(unitNumber));
if (interval >= unitNumber) {
var remainder = interval % unitNumber;
if (remainder > 0) {
var remainderBit = Math.floor(Math.log10(remainder));
return Math.abs(remainderBit - unitBit);
}
}
else {
var intervalBit = Math.floor(Math.log10(interval));
return Math.abs(intervalBit - unitBit);
}
return 0;
}
//# sourceMappingURL=digits-abbreviate.js.map