@antv/f2
Version:
Charts for mobile visualization.
103 lines (102 loc) • 3.69 kB
JavaScript
import { __assign, __extends } from "tslib";
import { Cache, get, isArray, isNil } from '@antv/util';
import Adjust from './adjust';
var Stack = /** @class */function (_super) {
__extends(Stack, _super);
function Stack(cfg) {
var _this = _super.call(this, cfg) || this;
var _a = cfg.adjustNames,
adjustNames = _a === void 0 ? ['y'] : _a,
_b = cfg.height,
height = _b === void 0 ? NaN : _b,
_c = cfg.size,
size = _c === void 0 ? 10 : _c,
_d = cfg.reverseOrder,
reverseOrder = _d === void 0 ? false : _d;
_this.adjustNames = adjustNames;
_this.height = height;
_this.size = size;
_this.reverseOrder = reverseOrder;
return _this;
}
/**
* 方法入参是经过数据分组、数据数字化之后的二维数组
* @param groupDataArray 分组之后的数据
*/
Stack.prototype.process = function (groupDataArray) {
var _a = this,
yField = _a.yField,
reverseOrder = _a.reverseOrder;
// 如果有指定 y 字段,那么按照 y 字段来 stack
// 否则,按照高度均分
var d = yField ? this.processStack(groupDataArray) : this.processOneDimStack(groupDataArray);
return reverseOrder ? this.reverse(d) : d;
};
Stack.prototype.reverse = function (groupedDataArray) {
return groupedDataArray.slice(0).reverse();
};
Stack.prototype.processStack = function (groupDataArray) {
var _a = this,
xField = _a.xField,
yField = _a.yField,
reverseOrder = _a.reverseOrder;
// 层叠顺序翻转
var groupedDataArray = reverseOrder ? this.reverse(groupDataArray) : groupDataArray;
// 用来缓存,正数和负数的堆叠问题
var positive = new Cache();
var negative = new Cache();
return groupedDataArray.map(function (dataArray) {
return dataArray.map(function (data) {
var _a;
var x = get(data, xField, 0);
var y = get(data, [yField]);
var xKey = x.toString();
// todo 是否应该取 _origin?因为 y 可能取到的值不正确,比如先 symmetric,再 stack!
y = isArray(y) ? y[1] : y;
if (!isNil(y)) {
var cache = y >= 0 ? positive : negative;
if (!cache.has(xKey)) {
cache.set(xKey, 0);
}
var xValue = cache.get(xKey);
var newXValue = y + xValue;
// 存起来
cache.set(xKey, newXValue);
return __assign(__assign({}, data), (_a = {}, _a[yField] = [xValue, newXValue], _a));
}
// 没有修改,则直接返回
return data;
});
});
};
Stack.prototype.processOneDimStack = function (groupDataArray) {
var _this = this;
var _a = this,
xField = _a.xField,
height = _a.height,
reverseOrder = _a.reverseOrder;
var yField = 'y';
// 如果层叠的顺序翻转
var groupedDataArray = reverseOrder ? this.reverse(groupDataArray) : groupDataArray;
// 缓存累加数据
var cache = new Cache();
return groupedDataArray.map(function (dataArray) {
return dataArray.map(function (data) {
var _a;
var size = _this.size;
var xValue = data[xField];
// todo 没有看到这个 stack 计算原理
var stackHeight = size * 2 / height;
if (!cache.has(xValue)) {
cache.set(xValue, stackHeight / 2); // 初始值大小
}
var stackValue = cache.get(xValue);
// 增加一层 stackHeight
cache.set(xValue, stackValue + stackHeight);
return __assign(__assign({}, data), (_a = {}, _a[yField] = stackValue, _a));
});
});
};
return Stack;
}(Adjust);
export default Stack;