76 lines
2.9 KiB
Java
76 lines
2.9 KiB
Java
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var tslib_1 = require("tslib");
|
|
var util_1 = require("@antv/util");
|
|
var simple_statistics_1 = require("simple-statistics");
|
|
var partition_1 = tslib_1.__importDefault(require("../util/partition"));
|
|
var data_set_1 = require("../data-set");
|
|
var option_parser_1 = require("../util/option-parser");
|
|
var DEFAULT_OPTIONS = {
|
|
fields: ['name', 'value'],
|
|
rows: 5,
|
|
size: [1, 1],
|
|
scale: 1,
|
|
groupBy: [],
|
|
maxCount: 1000,
|
|
gapRatio: 0.1,
|
|
as: ['x', 'y'],
|
|
};
|
|
function transform(dataView, options) {
|
|
options = util_1.assign({}, DEFAULT_OPTIONS, options);
|
|
var fields = option_parser_1.getFields(options);
|
|
var _a = tslib_1.__read(fields, 2), nameField = _a[0], valueField = _a[1];
|
|
var _b = tslib_1.__read(options.as, 2), asX = _b[0], asY = _b[1];
|
|
var groupBy = options.groupBy;
|
|
var groups = partition_1.default(dataView.rows, groupBy);
|
|
var groupKeys = util_1.keys(groups);
|
|
var _c = tslib_1.__read(options.size, 2), width = _c[0], height = _c[1];
|
|
var maxCount = options.maxCount;
|
|
var groupCount = groupKeys.length;
|
|
var partHeight = height / groupCount;
|
|
var rows = options.rows;
|
|
var gapRatio = options.gapRatio;
|
|
var result = [];
|
|
var scale = options.scale;
|
|
var currentGroupIndex = 0;
|
|
var wStep = 0;
|
|
// getting suitable scale and width step
|
|
util_1.forIn(groups, function (group) {
|
|
var totalValue = simple_statistics_1.sum(util_1.map(group, function (row) { return row[valueField]; }));
|
|
var cols = Math.ceil((totalValue * scale) / rows);
|
|
if (totalValue * scale > maxCount) {
|
|
scale = maxCount / totalValue;
|
|
cols = Math.ceil((totalValue * scale) / rows);
|
|
}
|
|
wStep = width / cols;
|
|
});
|
|
// distributing values into grid
|
|
util_1.forIn(groups, function (group) {
|
|
var heightRange = [currentGroupIndex * partHeight, (currentGroupIndex + 1) * partHeight];
|
|
var h = heightRange[1] - heightRange[0];
|
|
var hStep = (h * (1 - gapRatio)) / rows;
|
|
var currentCol = 0;
|
|
var currentRow = 0;
|
|
util_1.each(group, function (row) {
|
|
var value = row[valueField];
|
|
var count = Math.round(value * scale);
|
|
for (var i = 0; i < count; i++) {
|
|
if (currentRow === rows) {
|
|
currentRow = 0;
|
|
currentCol++;
|
|
}
|
|
var resultRow = util_1.pick(row, [nameField, valueField].concat(groupBy));
|
|
resultRow[asX] = currentCol * wStep + wStep / 2;
|
|
resultRow[asY] = currentRow * hStep + hStep / 2 + heightRange[0];
|
|
resultRow._wStep = wStep;
|
|
resultRow._hStep = hStep;
|
|
currentRow++;
|
|
result.push(resultRow);
|
|
}
|
|
});
|
|
currentGroupIndex += 1;
|
|
});
|
|
dataView.rows = result;
|
|
}
|
|
data_set_1.DataSet.registerTransform('waffle', transform);
|