@antv/adjust
Advanced tools
Comparing version 0.2.0 to 0.2.1-beta.1
@@ -1,37 +0,39 @@ | ||
import { AdjustCfg, DataPointType, RangeType } from '../interface'; | ||
import { AdjustCfg, Data, Range } from '../interface'; | ||
export declare type AdjustConstructor = new (cfg: any) => Adjust; | ||
export interface DimValuesMapType { | ||
[dim: string]: number[]; | ||
[dim: string]: number[]; | ||
} | ||
export default abstract class Adjust { | ||
cfg: AdjustCfg; | ||
constructor(cfg: AdjustCfg); | ||
/** | ||
* 查看维度是否是 adjust 字段 | ||
* @param dim | ||
*/ | ||
isAdjust(dim: string): boolean; | ||
getAdjustRange(dim: string, dimValue: number, values: number[]): RangeType; | ||
adjustData(groupedDataArray: DataPointType[][], mergedData: DataPointType[]): void; | ||
/** | ||
* 对数据进行分组adjustData | ||
* @param data 数据 | ||
* @param dim 分组的字段 | ||
* @return 分组结果 | ||
*/ | ||
groupData( | ||
data: DataPointType[], | ||
dim: string | ||
): { | ||
[dim: string]: DataPointType[]; | ||
}; | ||
abstract process(dataArray: DataPointType[][]): DataPointType[][]; | ||
abstract adjustDim(dim: string, values: number[], data: DataPointType[], length?: number, index?: number): any; | ||
/** | ||
* @protected | ||
* 获取可调整度量对应的值 | ||
* @param mergedData 数据 | ||
* @return 值的映射 | ||
*/ | ||
protected _getDimValues(mergedData: DataPointType[]): DimValuesMapType; | ||
/** 参与调整的维度 */ | ||
adjustNames: string[]; | ||
/** x 维度对应的字段 */ | ||
readonly xField: string; | ||
/** y 维度对应的字段 */ | ||
readonly yField: string; | ||
constructor(cfg: AdjustCfg); | ||
abstract process(dataArray: Data[][]): Data[][]; | ||
/** | ||
* 查看维度是否是 adjust 字段 | ||
* @param dim | ||
*/ | ||
isAdjust(dim: string): boolean; | ||
protected getAdjustRange(dim: string, dimValue: number, values: number[]): Range; | ||
protected adjustData(groupedDataArray: Data[][], mergedData: Data[]): void; | ||
/** | ||
* 对数据进行分组adjustData | ||
* @param data 数据 | ||
* @param dim 分组的字段 | ||
* @return 分组结果 | ||
*/ | ||
protected groupData(data: Data[], dim: string): { | ||
[dim: string]: Data[]; | ||
}; | ||
/** @override */ | ||
protected adjustDim(dim: string, values: number[], data: Data[], index?: number): void; | ||
/** | ||
* 获取可调整度量对应的值 | ||
* @param mergedData 数据 | ||
* @return 值的映射 | ||
*/ | ||
private getDimValues; | ||
} |
@@ -1,10 +0,9 @@ | ||
import * as tslib_1 from "tslib"; | ||
import * as _ from '@antv/util'; | ||
var DEFAULT_Y = 0; // 默认的 y 的值 | ||
import { DEFAULT_Y } from '../constant'; | ||
var Adjust = /** @class */ (function () { | ||
function Adjust(cfg) { | ||
this.cfg = { | ||
adjustNames: ['x', 'y'], | ||
}; | ||
this.cfg = tslib_1.__assign({}, this.cfg, cfg); | ||
var xField = cfg.xField, yField = cfg.yField, _a = cfg.adjustNames, adjustNames = _a === void 0 ? ['x', 'y'] : _a; | ||
this.adjustNames = adjustNames; | ||
this.xField = xField; | ||
this.yField = yField; | ||
} | ||
@@ -16,6 +15,6 @@ /** | ||
Adjust.prototype.isAdjust = function (dim) { | ||
return this.cfg.adjustNames.indexOf(dim) >= 0; | ||
return this.adjustNames.indexOf(dim) >= 0; | ||
}; | ||
Adjust.prototype.getAdjustRange = function (dim, dimValue, values) { | ||
var yField = this.cfg.yField; | ||
var yField = this.yField; | ||
var index = values.indexOf(dimValue); | ||
@@ -60,3 +59,3 @@ var length = values.length; | ||
// 所有调整维度的值数组 | ||
var dimValuesMap = this._getDimValues(mergedData); | ||
var dimValuesMap = this.getDimValues(mergedData); | ||
// 按照每一个分组来进行调整 | ||
@@ -68,3 +67,3 @@ _.each(groupedDataArray, function (dataArray, index) { | ||
// 根据不同的度量分别调整位置 | ||
_this.adjustDim(dim, values, dataArray, groupedDataArray.length, index); | ||
_this.adjustDim(dim, values, dataArray, index); | ||
}); | ||
@@ -89,4 +88,5 @@ }); | ||
}; | ||
/** @override */ | ||
Adjust.prototype.adjustDim = function (dim, values, data, index) { }; | ||
/** | ||
* @protected | ||
* 获取可调整度量对应的值 | ||
@@ -96,4 +96,4 @@ * @param mergedData 数据 | ||
*/ | ||
Adjust.prototype._getDimValues = function (mergedData) { | ||
var _a = this.cfg, xField = _a.xField, yField = _a.yField; | ||
Adjust.prototype.getDimValues = function (mergedData) { | ||
var _a = this, xField = _a.xField, yField = _a.yField; | ||
var dimValuesMap = {}; | ||
@@ -110,3 +110,2 @@ // 所有的维度 | ||
// 在每个维度上,所有的值 | ||
// @ts-ignore | ||
dimValuesMap[dim] = _.valuesOfKey(mergedData, dim).sort(function (v1, v2) { return v1 - v2; }); | ||
@@ -113,0 +112,0 @@ }); |
@@ -1,15 +0,18 @@ | ||
import { DataPointType, DodgeCfg, RangeType } from '../interface'; | ||
import { Data, DodgeCfg } from '../interface'; | ||
import Adjust from './adjust'; | ||
export default class Dodge extends Adjust { | ||
cacheMap: { | ||
[key: string]: any; | ||
}; | ||
adjustDataArray: DataPointType[][]; | ||
mergeData: DataPointType[]; | ||
cfg: DodgeCfg; | ||
constructor(cfg: DodgeCfg); | ||
process(groupDataArray: DataPointType[][]): DataPointType[][]; | ||
getDodgeOffset(range: RangeType, idx: number, len: number): number; | ||
getDistribution(dim: string): any; | ||
adjustDim(dim: string, values: number[], data: DataPointType[], frameCount: number, frameIndex: number): any[]; | ||
/** 调整占单位宽度的比例,例如:占 2 个分类间距的 1 / 2 */ | ||
readonly dodgeRatio: number; | ||
/** 调整过程中 2 个数据的间距,以 dodgeRatio 为分母 */ | ||
readonly marginRatio: number; | ||
/** 指定进行 dodge 的字段 */ | ||
readonly dodgeBy: string; | ||
private cacheMap; | ||
private adjustDataArray; | ||
private mergeData; | ||
constructor(cfg: DodgeCfg); | ||
process(groupDataArray: Data[][]): Data[][]; | ||
protected adjustDim(dim: string, values: number[], data: Data[], frameIndex: number): any[]; | ||
private getDodgeOffset; | ||
private getDistribution; | ||
} |
@@ -1,9 +0,7 @@ | ||
import * as tslib_1 from "tslib"; | ||
import { __extends } from "tslib"; | ||
import * as _ from '@antv/util'; | ||
import { DODGE_RATIO, MARGIN_RATIO } from '../constant'; | ||
import Adjust from './adjust'; | ||
// 偏移之后,间距 | ||
var MARGIN_RATIO = 1 / 2; | ||
var DODGE_RATIO = 1 / 2; | ||
var Dodge = /** @class */ (function (_super) { | ||
tslib_1.__extends(Dodge, _super); | ||
__extends(Dodge, _super); | ||
function Dodge(cfg) { | ||
@@ -14,12 +12,5 @@ var _this = _super.call(this, cfg) || this; | ||
_this.mergeData = []; | ||
_this.cfg = { | ||
adjustNames: ['x', 'y'], | ||
xField: '', | ||
yField: '', | ||
// 调整过程中,2个数据的间距 | ||
marginRatio: MARGIN_RATIO, | ||
// 调整占单位宽度的比例,例如:占 2 个分类间距的 1 / 2 | ||
dodgeRatio: DODGE_RATIO, | ||
}; | ||
_this.cfg = tslib_1.__assign({}, _this.cfg, cfg); | ||
var _a = cfg.marginRatio, marginRatio = _a === void 0 ? MARGIN_RATIO : _a, _b = cfg.dodgeRatio, dodgeRatio = _b === void 0 ? DODGE_RATIO : _b; | ||
_this.marginRatio = marginRatio; | ||
_this.dodgeRatio = dodgeRatio; | ||
return _this; | ||
@@ -31,3 +22,3 @@ } | ||
var mergeData = _.flatten(groupedDataArray); | ||
var dodgeBy = this.cfg.dodgeBy; | ||
var dodgeBy = this.dodgeBy; | ||
// 如果指定了分组 dim 的字段 | ||
@@ -41,8 +32,32 @@ var adjustDataArray = dodgeBy ? _.group(mergeData, dodgeBy) : groupedDataArray; | ||
this.mergeData = []; | ||
// 下面不能注释掉,不然单测报错,我也不知道为啥 todo | ||
// this.cacheMap = {}; | ||
return groupedDataArray; | ||
}; | ||
Dodge.prototype.adjustDim = function (dim, values, data, frameIndex) { | ||
var _this = this; | ||
var map = this.getDistribution(dim); | ||
var groupData = this.groupData(data, dim); // 根据值分组 | ||
_.each(groupData, function (group, key) { | ||
var range; | ||
// xField 中只有一个值,不需要做 dodge | ||
if (values.length === 1) { | ||
range = { | ||
pre: values[0] - 1, | ||
next: values[0] + 1, | ||
}; | ||
} | ||
else { | ||
// 如果有多个,则需要获取调整的范围 | ||
range = _this.getAdjustRange(dim, parseFloat(key), values); | ||
} | ||
_.each(group, function (d) { | ||
var value = d[dim]; | ||
var valueArr = map[value]; | ||
var valIndex = valueArr.indexOf(frameIndex); | ||
d[dim] = _this.getDodgeOffset(range, valIndex, valueArr.length); | ||
}); | ||
}); | ||
return []; | ||
}; | ||
Dodge.prototype.getDodgeOffset = function (range, idx, len) { | ||
var _a = this.cfg, dodgeRatio = _a.dodgeRatio, marginRatio = _a.marginRatio; | ||
var _a = this, dodgeRatio = _a.dodgeRatio, marginRatio = _a.marginRatio; | ||
var pre = range.pre, next = range.next; | ||
@@ -80,28 +95,2 @@ var tickLength = next - pre; | ||
}; | ||
Dodge.prototype.adjustDim = function (dim, values, data, frameCount, frameIndex) { | ||
var _this = this; | ||
var map = this.getDistribution(dim); | ||
var groupData = this.groupData(data, dim); // 根据值分组 | ||
_.each(groupData, function (group, key) { | ||
var range; | ||
// xField 中只有一个值,不需要做 dodge | ||
if (values.length === 1) { | ||
range = { | ||
pre: values[0] - 1, | ||
next: values[0] + 1, | ||
}; | ||
} | ||
else { | ||
// 如果有多个,则需要获取调整的范围 | ||
range = _this.getAdjustRange(dim, parseFloat(key), values); | ||
} | ||
_.each(group, function (d) { | ||
var value = d[dim]; | ||
var valueArr = map[value]; | ||
var valIndex = valueArr.indexOf(frameIndex); | ||
d[dim] = _this.getDodgeOffset(range, valIndex, valueArr.length); | ||
}); | ||
}); | ||
return []; | ||
}; | ||
return Dodge; | ||
@@ -108,0 +97,0 @@ }(Adjust)); |
@@ -1,17 +0,14 @@ | ||
import { DataPointType, JitterCfg, RangeType } from '../interface'; | ||
import { Data } from '../interface'; | ||
import Adjust from './adjust'; | ||
export default class Jitter extends Adjust { | ||
cfg: JitterCfg; | ||
constructor(cfg: JitterCfg); | ||
process(groupDataArray: DataPointType[][]): DataPointType[][]; | ||
randomNumber(min: number, max: number): number; | ||
getAdjustOffset(range: RangeType): number; | ||
_adjustGroup(group: DataPointType[], dim: string, dimValue: number, values: number[]): DataPointType[]; | ||
/** | ||
* 当前数据分组(index)中,按照维度 dim 进行 jitter 调整 | ||
* @param dim | ||
* @param values | ||
* @param dataArray | ||
*/ | ||
adjustDim(dim: string, values: number[], dataArray: DataPointType[]): void; | ||
process(groupDataArray: Data[][]): Data[][]; | ||
/** | ||
* 当前数据分组(index)中,按照维度 dim 进行 jitter 调整 | ||
* @param dim | ||
* @param values | ||
* @param dataArray | ||
*/ | ||
protected adjustDim(dim: string, values: number[], dataArray: Data[]): void; | ||
private getAdjustOffset; | ||
private adjustGroup; | ||
} |
@@ -1,17 +0,12 @@ | ||
import * as tslib_1 from "tslib"; | ||
import { __extends } from "tslib"; | ||
import * as _ from '@antv/util'; | ||
import { GAP } from '../constant'; | ||
import Adjust from './adjust'; | ||
// 散点分开之后,距离边界的距离 | ||
var GAP = 0.05; | ||
function randomNumber(min, max) { | ||
return (max - min) * Math.random() + min; | ||
} | ||
var Jitter = /** @class */ (function (_super) { | ||
tslib_1.__extends(Jitter, _super); | ||
function Jitter(cfg) { | ||
var _this = _super.call(this, cfg) || this; | ||
_this.cfg = { | ||
adjustNames: ['x', 'y'], | ||
xField: '', | ||
yField: '', | ||
}; | ||
_this.cfg = tslib_1.__assign({}, _this.cfg, cfg); | ||
return _this; | ||
__extends(Jitter, _super); | ||
function Jitter() { | ||
return _super !== null && _super.apply(this, arguments) || this; | ||
} | ||
@@ -26,4 +21,15 @@ Jitter.prototype.process = function (groupDataArray) { | ||
}; | ||
Jitter.prototype.randomNumber = function (min, max) { | ||
return (max - min) * Math.random() + min; | ||
/** | ||
* 当前数据分组(index)中,按照维度 dim 进行 jitter 调整 | ||
* @param dim | ||
* @param values | ||
* @param dataArray | ||
*/ | ||
Jitter.prototype.adjustDim = function (dim, values, dataArray) { | ||
var _this = this; | ||
// 在每一个分组中,将数据再按照 dim 分组,用于散列 | ||
var groupDataArray = this.groupData(dataArray, dim); | ||
return _.each(groupDataArray, function (data, dimValue) { | ||
return _this.adjustGroup(data, dim, parseFloat(dimValue), values); | ||
}); | ||
}; | ||
@@ -35,6 +41,6 @@ // 随机出来的字段值 | ||
var margin = (next - pre) * GAP; | ||
return this.randomNumber(pre + margin, next - margin); | ||
return randomNumber(pre + margin, next - margin); | ||
}; | ||
// adjust group data | ||
Jitter.prototype._adjustGroup = function (group, dim, dimValue, values) { | ||
Jitter.prototype.adjustGroup = function (group, dim, dimValue, values) { | ||
var _this = this; | ||
@@ -44,6 +50,2 @@ // 调整范围 | ||
_.each(group, function (data) { | ||
// return { | ||
// ...data, | ||
// [dim]: this.getAdjustOffset(range); // 获取调整的位置 | ||
// } | ||
data[dim] = _this.getAdjustOffset(range); // 获取调整的位置 | ||
@@ -53,16 +55,2 @@ }); | ||
}; | ||
/** | ||
* 当前数据分组(index)中,按照维度 dim 进行 jitter 调整 | ||
* @param dim | ||
* @param values | ||
* @param dataArray | ||
*/ | ||
Jitter.prototype.adjustDim = function (dim, values, dataArray) { | ||
var _this = this; | ||
// 在每一个分组中,将数据再按照 dim 分组,用于散列 | ||
var groupDataArray = this.groupData(dataArray, dim); | ||
return _.each(groupDataArray, function (da, dimValue) { | ||
return _this._adjustGroup(da, dim, parseFloat(dimValue), values); | ||
}); | ||
}; | ||
return Jitter; | ||
@@ -69,0 +57,0 @@ }(Adjust)); |
@@ -1,15 +0,16 @@ | ||
import { DataPointType, StackCfg } from '../interface'; | ||
import { Data, StackCfg } from '../interface'; | ||
import Adjust from './adjust'; | ||
export default class Stack extends Adjust { | ||
cfg: StackCfg; | ||
constructor(cfg: StackCfg); | ||
_reverse(groupedDataArray: DataPointType[][]): DataPointType[][]; | ||
/** | ||
* 方法入参是经过数据分组、数据数字化之后的二维数组 | ||
* @param groupDataArray 分组之后的数据 | ||
*/ | ||
process(groupDataArray: DataPointType[][]): DataPointType[][]; | ||
processStack(groupDataArray: DataPointType[][]): DataPointType[][]; | ||
processOneDimStack(groupDataArray: DataPointType[][]): DataPointType[][]; | ||
adjustDim(dim: string, values: number[], data: object[]): void; | ||
readonly height: number; | ||
readonly size: number; | ||
readonly reverseOrder: boolean; | ||
constructor(cfg: StackCfg); | ||
/** | ||
* 方法入参是经过数据分组、数据数字化之后的二维数组 | ||
* @param groupDataArray 分组之后的数据 | ||
*/ | ||
process(groupDataArray: Data[][]): Data[][]; | ||
private reverse; | ||
private processStack; | ||
private processOneDimStack; | ||
} |
@@ -1,2 +0,2 @@ | ||
import * as tslib_1 from "tslib"; | ||
import { __assign, __extends } from "tslib"; | ||
import * as _ from '@antv/util'; | ||
@@ -6,19 +6,12 @@ import Adjust from './adjust'; | ||
var Stack = /** @class */ (function (_super) { | ||
tslib_1.__extends(Stack, _super); | ||
__extends(Stack, _super); | ||
function Stack(cfg) { | ||
var _this = _super.call(this, cfg) || this; | ||
_this.cfg = { | ||
adjustNames: ['y'], | ||
xField: '', | ||
yField: '', | ||
height: NaN, | ||
size: 10, | ||
reverseOrder: false, | ||
}; | ||
_this.cfg = tslib_1.__assign({}, _this.cfg, cfg); | ||
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; | ||
} | ||
Stack.prototype._reverse = function (groupedDataArray) { | ||
return groupedDataArray.slice(0).reverse(); | ||
}; | ||
/** | ||
@@ -29,12 +22,15 @@ * 方法入参是经过数据分组、数据数字化之后的二维数组 | ||
Stack.prototype.process = function (groupDataArray) { | ||
var _a = this.cfg, yField = _a.yField, reverseOrder = _a.reverseOrder; | ||
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; | ||
return reverseOrder ? this.reverse(d) : d; | ||
}; | ||
Stack.prototype.reverse = function (groupedDataArray) { | ||
return groupedDataArray.slice(0).reverse(); | ||
}; | ||
Stack.prototype.processStack = function (groupDataArray) { | ||
var _a = this.cfg, xField = _a.xField, yField = _a.yField, reverseOrder = _a.reverseOrder; | ||
var _a = this, xField = _a.xField, yField = _a.yField, reverseOrder = _a.reverseOrder; | ||
// 层叠顺序翻转 | ||
var groupedDataArray = reverseOrder ? this._reverse(groupDataArray) : groupDataArray; | ||
var groupedDataArray = reverseOrder ? this.reverse(groupDataArray) : groupDataArray; | ||
// 用来缓存,正数和负数的堆叠问题 | ||
@@ -60,3 +56,3 @@ var positive = new Cache(); | ||
cache.set(xKey, newXValue); | ||
return tslib_1.__assign({}, data, (_a = {}, _a[yField] = [xValue, newXValue], _a)); | ||
return __assign(__assign({}, data), (_a = {}, _a[yField] = [xValue, newXValue], _a)); | ||
} | ||
@@ -68,11 +64,8 @@ // 没有修改,则直接返回 | ||
}; | ||
// todo 不明白画出来是什么含义 | ||
Stack.prototype.processOneDimStack = function (groupDataArray) { | ||
var _this = this; | ||
var _a = this.cfg, xField = _a.xField, height = _a.height, reverseOrder = _a.reverseOrder; | ||
var yField = this.cfg.yField; | ||
// todo processOneDimStack 必然是 yField 不存在 | ||
yField = 'y'; | ||
var _a = this, xField = _a.xField, height = _a.height, reverseOrder = _a.reverseOrder; | ||
var yField = 'y'; | ||
// 如果层叠的顺序翻转 | ||
var groupedDataArray = reverseOrder ? this._reverse(groupDataArray) : groupDataArray; | ||
var groupedDataArray = reverseOrder ? this.reverse(groupDataArray) : groupDataArray; | ||
// 缓存累加数据 | ||
@@ -83,3 +76,3 @@ var cache = new Cache(); | ||
var _a; | ||
var size = _this.cfg.size; | ||
var size = _this.size; | ||
var xValue = data[xField]; | ||
@@ -94,8 +87,6 @@ // todo 没有看到这个 stack 计算原理 | ||
cache.set(xValue, stackValue + stackHeight); | ||
return tslib_1.__assign({}, data, (_a = {}, _a[yField] = stackValue, _a)); | ||
return __assign(__assign({}, data), (_a = {}, _a[yField] = stackValue, _a)); | ||
}); | ||
}); | ||
}; | ||
// 没有用到,空实现 | ||
Stack.prototype.adjustDim = function (dim, values, data) { }; | ||
return Stack; | ||
@@ -102,0 +93,0 @@ }(Adjust)); |
@@ -1,14 +0,7 @@ | ||
import { DataPointType, SymmetricCfg } from '../interface'; | ||
import { Data } from '../interface'; | ||
import Adjust from './adjust'; | ||
export default class Symmetric extends Adjust { | ||
cfg: SymmetricCfg; | ||
constructor(cfg: SymmetricCfg); | ||
process(groupDataArray: DataPointType[][]): DataPointType[][]; | ||
_getXValuesMaxMap( | ||
mergeData: DataPointType[] | ||
): { | ||
[key: string]: number; | ||
}; | ||
_getDimMaxValue(mergeData: DataPointType[], dim: string): number; | ||
adjustDim(dim: string, values: number[], data: object[]): void; | ||
process(groupDataArray: Data[][]): Data[][]; | ||
private getXValuesMaxMap; | ||
private getDimMaxValue; | ||
} |
@@ -1,24 +0,15 @@ | ||
import * as tslib_1 from "tslib"; | ||
import { __assign, __extends } from "tslib"; | ||
import * as _ from '@antv/util'; | ||
import Adjust from './adjust'; | ||
var Symmetric = /** @class */ (function (_super) { | ||
tslib_1.__extends(Symmetric, _super); | ||
function Symmetric(cfg) { | ||
var _this = _super.call(this, cfg) || this; | ||
_this.cfg = { | ||
adjustNames: [], | ||
xField: '', | ||
yField: '', | ||
}; | ||
_this.cfg = tslib_1.__assign({}, _this.cfg, cfg); | ||
return _this; | ||
__extends(Symmetric, _super); | ||
function Symmetric() { | ||
return _super !== null && _super.apply(this, arguments) || this; | ||
} | ||
// 入口函数 | ||
Symmetric.prototype.process = function (groupDataArray) { | ||
var mergeData = _.flatten(groupDataArray); | ||
var _a = this.cfg, xField = _a.xField, yField = _a.yField; | ||
var _a = this, xField = _a.xField, yField = _a.yField; | ||
// 每个 x 值对应的 最大值 | ||
var cache = this._getXValuesMaxMap(mergeData); | ||
var cache = this.getXValuesMaxMap(mergeData); | ||
// 所有数据的最大的值 | ||
// const max = this._getDimMaxValue(mergeData, yField); | ||
var max = Math.max.apply(Math, Object.keys(cache).map(function (key) { return cache[key]; })); | ||
@@ -33,7 +24,7 @@ return _.map(groupDataArray, function (dataArray) { | ||
var off_1 = (max - cache[xValue]) / 2; | ||
return tslib_1.__assign({}, data, (_a = {}, _a[yField] = _.map(yValue, function (y) { return off_1 + y; }), _a)); | ||
return __assign(__assign({}, data), (_a = {}, _a[yField] = _.map(yValue, function (y) { return off_1 + y; }), _a)); | ||
} | ||
// 非数组处理逻辑 | ||
var offset = (max - yValue) / 2; | ||
return tslib_1.__assign({}, data, (_b = {}, _b[yField] = [offset, yValue + offset], _b)); | ||
return __assign(__assign({}, data), (_b = {}, _b[yField] = [offset, yValue + offset], _b)); | ||
}); | ||
@@ -43,11 +34,11 @@ }); | ||
// 获取每个 x 对应的最大的值 | ||
Symmetric.prototype._getXValuesMaxMap = function (mergeData) { | ||
Symmetric.prototype.getXValuesMaxMap = function (mergeData) { | ||
var _this = this; | ||
var _a = this.cfg, xField = _a.xField, yField = _a.yField; | ||
var _a = this, xField = _a.xField, yField = _a.yField; | ||
// 根据 xField 的值进行分组 | ||
var groupDataArray = _.groupBy(mergeData, function (data) { return data[xField]; }); | ||
// 获取每个 xField 值中的最大值 | ||
return _.mapValues(groupDataArray, function (dataArray) { return _this._getDimMaxValue(dataArray, yField); }); | ||
return _.mapValues(groupDataArray, function (dataArray) { return _this.getDimMaxValue(dataArray, yField); }); | ||
}; | ||
Symmetric.prototype._getDimMaxValue = function (mergeData, dim) { | ||
Symmetric.prototype.getDimMaxValue = function (mergeData, dim) { | ||
// 所有的 value 值 | ||
@@ -60,4 +51,2 @@ var dimValues = _.map(mergeData, function (data) { return _.get(data, dim, []); }); | ||
}; | ||
// 没有用到,空实现 | ||
Symmetric.prototype.adjustDim = function (dim, values, data) { }; | ||
return Symmetric; | ||
@@ -64,0 +53,0 @@ }(Adjust)); |
@@ -1,43 +0,34 @@ | ||
export interface AdjustBaseCfg { | ||
readonly adjustNames: string[]; | ||
} | ||
export interface AdjustCfg { | ||
readonly adjustNames: string[]; | ||
readonly xField?: string; | ||
readonly yField?: string; | ||
readonly dodgeBy?: string; | ||
readonly marginRatio?: number; | ||
readonly dodgeRatio?: number; | ||
readonly size?: number; | ||
readonly height?: number; | ||
readonly reverseOrder?: boolean; | ||
readonly adjustNames?: string[]; | ||
readonly xField?: string; | ||
readonly yField?: string; | ||
readonly dodgeBy?: string; | ||
readonly marginRatio?: number; | ||
readonly dodgeRatio?: number; | ||
readonly size?: number; | ||
readonly height?: number; | ||
readonly reverseOrder?: boolean; | ||
} | ||
export interface DodgeCfg extends AdjustBaseCfg { | ||
readonly xField: string; | ||
readonly yField: string; | ||
readonly marginRatio: number; | ||
readonly dodgeRatio: number; | ||
readonly dodgeBy?: string; | ||
export interface DodgeCfg { | ||
readonly adjustNames?: string[]; | ||
readonly xField: string; | ||
readonly yField?: string; | ||
readonly marginRatio?: number; | ||
readonly dodgeRatio?: number; | ||
readonly dodgeBy?: string; | ||
} | ||
export interface JitterCfg extends AdjustBaseCfg { | ||
readonly xField: string; | ||
readonly yField: string; | ||
export interface StackCfg { | ||
readonly adjustNames?: string[]; | ||
readonly xField: string; | ||
readonly yField?: string; | ||
readonly height?: number; | ||
readonly size?: number; | ||
readonly reverseOrder?: boolean; | ||
} | ||
export interface StackCfg extends AdjustBaseCfg { | ||
readonly xField: string; | ||
readonly yField: string; | ||
readonly height: number; | ||
readonly size: number; | ||
readonly reverseOrder: boolean; | ||
export interface Data { | ||
[key: string]: any; | ||
} | ||
export interface SymmetricCfg extends AdjustBaseCfg { | ||
readonly xField: string; | ||
readonly yField: string; | ||
export interface Range { | ||
pre: number; | ||
next: number; | ||
} | ||
export interface DataPointType { | ||
[key: string]: any; | ||
} | ||
export interface RangeType { | ||
pre: number; | ||
next: number; | ||
} |
@@ -1,37 +0,39 @@ | ||
import { AdjustCfg, DataPointType, RangeType } from '../interface'; | ||
import { AdjustCfg, Data, Range } from '../interface'; | ||
export declare type AdjustConstructor = new (cfg: any) => Adjust; | ||
export interface DimValuesMapType { | ||
[dim: string]: number[]; | ||
[dim: string]: number[]; | ||
} | ||
export default abstract class Adjust { | ||
cfg: AdjustCfg; | ||
constructor(cfg: AdjustCfg); | ||
/** | ||
* 查看维度是否是 adjust 字段 | ||
* @param dim | ||
*/ | ||
isAdjust(dim: string): boolean; | ||
getAdjustRange(dim: string, dimValue: number, values: number[]): RangeType; | ||
adjustData(groupedDataArray: DataPointType[][], mergedData: DataPointType[]): void; | ||
/** | ||
* 对数据进行分组adjustData | ||
* @param data 数据 | ||
* @param dim 分组的字段 | ||
* @return 分组结果 | ||
*/ | ||
groupData( | ||
data: DataPointType[], | ||
dim: string | ||
): { | ||
[dim: string]: DataPointType[]; | ||
}; | ||
abstract process(dataArray: DataPointType[][]): DataPointType[][]; | ||
abstract adjustDim(dim: string, values: number[], data: DataPointType[], length?: number, index?: number): any; | ||
/** | ||
* @protected | ||
* 获取可调整度量对应的值 | ||
* @param mergedData 数据 | ||
* @return 值的映射 | ||
*/ | ||
protected _getDimValues(mergedData: DataPointType[]): DimValuesMapType; | ||
/** 参与调整的维度 */ | ||
adjustNames: string[]; | ||
/** x 维度对应的字段 */ | ||
readonly xField: string; | ||
/** y 维度对应的字段 */ | ||
readonly yField: string; | ||
constructor(cfg: AdjustCfg); | ||
abstract process(dataArray: Data[][]): Data[][]; | ||
/** | ||
* 查看维度是否是 adjust 字段 | ||
* @param dim | ||
*/ | ||
isAdjust(dim: string): boolean; | ||
protected getAdjustRange(dim: string, dimValue: number, values: number[]): Range; | ||
protected adjustData(groupedDataArray: Data[][], mergedData: Data[]): void; | ||
/** | ||
* 对数据进行分组adjustData | ||
* @param data 数据 | ||
* @param dim 分组的字段 | ||
* @return 分组结果 | ||
*/ | ||
protected groupData(data: Data[], dim: string): { | ||
[dim: string]: Data[]; | ||
}; | ||
/** @override */ | ||
protected adjustDim(dim: string, values: number[], data: Data[], index?: number): void; | ||
/** | ||
* 获取可调整度量对应的值 | ||
* @param mergedData 数据 | ||
* @return 值的映射 | ||
*/ | ||
private getDimValues; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var tslib_1 = require("tslib"); | ||
var _ = require("@antv/util"); | ||
var DEFAULT_Y = 0; // 默认的 y 的值 | ||
var constant_1 = require("../constant"); | ||
var Adjust = /** @class */ (function () { | ||
function Adjust(cfg) { | ||
this.cfg = { | ||
adjustNames: ['x', 'y'], | ||
}; | ||
this.cfg = tslib_1.__assign({}, this.cfg, cfg); | ||
var xField = cfg.xField, yField = cfg.yField, _a = cfg.adjustNames, adjustNames = _a === void 0 ? ['x', 'y'] : _a; | ||
this.adjustNames = adjustNames; | ||
this.xField = xField; | ||
this.yField = yField; | ||
} | ||
@@ -18,6 +17,6 @@ /** | ||
Adjust.prototype.isAdjust = function (dim) { | ||
return this.cfg.adjustNames.indexOf(dim) >= 0; | ||
return this.adjustNames.indexOf(dim) >= 0; | ||
}; | ||
Adjust.prototype.getAdjustRange = function (dim, dimValue, values) { | ||
var yField = this.cfg.yField; | ||
var yField = this.yField; | ||
var index = values.indexOf(dimValue); | ||
@@ -62,3 +61,3 @@ var length = values.length; | ||
// 所有调整维度的值数组 | ||
var dimValuesMap = this._getDimValues(mergedData); | ||
var dimValuesMap = this.getDimValues(mergedData); | ||
// 按照每一个分组来进行调整 | ||
@@ -70,3 +69,3 @@ _.each(groupedDataArray, function (dataArray, index) { | ||
// 根据不同的度量分别调整位置 | ||
_this.adjustDim(dim, values, dataArray, groupedDataArray.length, index); | ||
_this.adjustDim(dim, values, dataArray, index); | ||
}); | ||
@@ -85,3 +84,3 @@ }); | ||
if (record[dim] === undefined) { | ||
record[dim] = DEFAULT_Y; | ||
record[dim] = constant_1.DEFAULT_Y; | ||
} | ||
@@ -92,4 +91,5 @@ }); | ||
}; | ||
/** @override */ | ||
Adjust.prototype.adjustDim = function (dim, values, data, index) { }; | ||
/** | ||
* @protected | ||
* 获取可调整度量对应的值 | ||
@@ -99,4 +99,4 @@ * @param mergedData 数据 | ||
*/ | ||
Adjust.prototype._getDimValues = function (mergedData) { | ||
var _a = this.cfg, xField = _a.xField, yField = _a.yField; | ||
Adjust.prototype.getDimValues = function (mergedData) { | ||
var _a = this, xField = _a.xField, yField = _a.yField; | ||
var dimValuesMap = {}; | ||
@@ -113,3 +113,2 @@ // 所有的维度 | ||
// 在每个维度上,所有的值 | ||
// @ts-ignore | ||
dimValuesMap[dim] = _.valuesOfKey(mergedData, dim).sort(function (v1, v2) { return v1 - v2; }); | ||
@@ -120,3 +119,3 @@ }); | ||
var dim = 'y'; | ||
dimValuesMap[dim] = [DEFAULT_Y, 1]; // 默认分布在 y 轴的 0 与 1 之间 | ||
dimValuesMap[dim] = [constant_1.DEFAULT_Y, 1]; // 默认分布在 y 轴的 0 与 1 之间 | ||
} | ||
@@ -123,0 +122,0 @@ return dimValuesMap; |
@@ -1,15 +0,18 @@ | ||
import { DataPointType, DodgeCfg, RangeType } from '../interface'; | ||
import { Data, DodgeCfg } from '../interface'; | ||
import Adjust from './adjust'; | ||
export default class Dodge extends Adjust { | ||
cacheMap: { | ||
[key: string]: any; | ||
}; | ||
adjustDataArray: DataPointType[][]; | ||
mergeData: DataPointType[]; | ||
cfg: DodgeCfg; | ||
constructor(cfg: DodgeCfg); | ||
process(groupDataArray: DataPointType[][]): DataPointType[][]; | ||
getDodgeOffset(range: RangeType, idx: number, len: number): number; | ||
getDistribution(dim: string): any; | ||
adjustDim(dim: string, values: number[], data: DataPointType[], frameCount: number, frameIndex: number): any[]; | ||
/** 调整占单位宽度的比例,例如:占 2 个分类间距的 1 / 2 */ | ||
readonly dodgeRatio: number; | ||
/** 调整过程中 2 个数据的间距,以 dodgeRatio 为分母 */ | ||
readonly marginRatio: number; | ||
/** 指定进行 dodge 的字段 */ | ||
readonly dodgeBy: string; | ||
private cacheMap; | ||
private adjustDataArray; | ||
private mergeData; | ||
constructor(cfg: DodgeCfg); | ||
process(groupDataArray: Data[][]): Data[][]; | ||
protected adjustDim(dim: string, values: number[], data: Data[], frameIndex: number): any[]; | ||
private getDodgeOffset; | ||
private getDistribution; | ||
} |
@@ -5,6 +5,4 @@ "use strict"; | ||
var _ = require("@antv/util"); | ||
var constant_1 = require("../constant"); | ||
var adjust_1 = require("./adjust"); | ||
// 偏移之后,间距 | ||
var MARGIN_RATIO = 1 / 2; | ||
var DODGE_RATIO = 1 / 2; | ||
var Dodge = /** @class */ (function (_super) { | ||
@@ -17,12 +15,5 @@ tslib_1.__extends(Dodge, _super); | ||
_this.mergeData = []; | ||
_this.cfg = { | ||
adjustNames: ['x', 'y'], | ||
xField: '', | ||
yField: '', | ||
// 调整过程中,2个数据的间距 | ||
marginRatio: MARGIN_RATIO, | ||
// 调整占单位宽度的比例,例如:占 2 个分类间距的 1 / 2 | ||
dodgeRatio: DODGE_RATIO, | ||
}; | ||
_this.cfg = tslib_1.__assign({}, _this.cfg, cfg); | ||
var _a = cfg.marginRatio, marginRatio = _a === void 0 ? constant_1.MARGIN_RATIO : _a, _b = cfg.dodgeRatio, dodgeRatio = _b === void 0 ? constant_1.DODGE_RATIO : _b; | ||
_this.marginRatio = marginRatio; | ||
_this.dodgeRatio = dodgeRatio; | ||
return _this; | ||
@@ -34,3 +25,3 @@ } | ||
var mergeData = _.flatten(groupedDataArray); | ||
var dodgeBy = this.cfg.dodgeBy; | ||
var dodgeBy = this.dodgeBy; | ||
// 如果指定了分组 dim 的字段 | ||
@@ -44,8 +35,32 @@ var adjustDataArray = dodgeBy ? _.group(mergeData, dodgeBy) : groupedDataArray; | ||
this.mergeData = []; | ||
// 下面不能注释掉,不然单测报错,我也不知道为啥 todo | ||
// this.cacheMap = {}; | ||
return groupedDataArray; | ||
}; | ||
Dodge.prototype.adjustDim = function (dim, values, data, frameIndex) { | ||
var _this = this; | ||
var map = this.getDistribution(dim); | ||
var groupData = this.groupData(data, dim); // 根据值分组 | ||
_.each(groupData, function (group, key) { | ||
var range; | ||
// xField 中只有一个值,不需要做 dodge | ||
if (values.length === 1) { | ||
range = { | ||
pre: values[0] - 1, | ||
next: values[0] + 1, | ||
}; | ||
} | ||
else { | ||
// 如果有多个,则需要获取调整的范围 | ||
range = _this.getAdjustRange(dim, parseFloat(key), values); | ||
} | ||
_.each(group, function (d) { | ||
var value = d[dim]; | ||
var valueArr = map[value]; | ||
var valIndex = valueArr.indexOf(frameIndex); | ||
d[dim] = _this.getDodgeOffset(range, valIndex, valueArr.length); | ||
}); | ||
}); | ||
return []; | ||
}; | ||
Dodge.prototype.getDodgeOffset = function (range, idx, len) { | ||
var _a = this.cfg, dodgeRatio = _a.dodgeRatio, marginRatio = _a.marginRatio; | ||
var _a = this, dodgeRatio = _a.dodgeRatio, marginRatio = _a.marginRatio; | ||
var pre = range.pre, next = range.next; | ||
@@ -83,28 +98,2 @@ var tickLength = next - pre; | ||
}; | ||
Dodge.prototype.adjustDim = function (dim, values, data, frameCount, frameIndex) { | ||
var _this = this; | ||
var map = this.getDistribution(dim); | ||
var groupData = this.groupData(data, dim); // 根据值分组 | ||
_.each(groupData, function (group, key) { | ||
var range; | ||
// xField 中只有一个值,不需要做 dodge | ||
if (values.length === 1) { | ||
range = { | ||
pre: values[0] - 1, | ||
next: values[0] + 1, | ||
}; | ||
} | ||
else { | ||
// 如果有多个,则需要获取调整的范围 | ||
range = _this.getAdjustRange(dim, parseFloat(key), values); | ||
} | ||
_.each(group, function (d) { | ||
var value = d[dim]; | ||
var valueArr = map[value]; | ||
var valIndex = valueArr.indexOf(frameIndex); | ||
d[dim] = _this.getDodgeOffset(range, valIndex, valueArr.length); | ||
}); | ||
}); | ||
return []; | ||
}; | ||
return Dodge; | ||
@@ -111,0 +100,0 @@ }(adjust_1.default)); |
@@ -1,17 +0,14 @@ | ||
import { DataPointType, JitterCfg, RangeType } from '../interface'; | ||
import { Data } from '../interface'; | ||
import Adjust from './adjust'; | ||
export default class Jitter extends Adjust { | ||
cfg: JitterCfg; | ||
constructor(cfg: JitterCfg); | ||
process(groupDataArray: DataPointType[][]): DataPointType[][]; | ||
randomNumber(min: number, max: number): number; | ||
getAdjustOffset(range: RangeType): number; | ||
_adjustGroup(group: DataPointType[], dim: string, dimValue: number, values: number[]): DataPointType[]; | ||
/** | ||
* 当前数据分组(index)中,按照维度 dim 进行 jitter 调整 | ||
* @param dim | ||
* @param values | ||
* @param dataArray | ||
*/ | ||
adjustDim(dim: string, values: number[], dataArray: DataPointType[]): void; | ||
process(groupDataArray: Data[][]): Data[][]; | ||
/** | ||
* 当前数据分组(index)中,按照维度 dim 进行 jitter 调整 | ||
* @param dim | ||
* @param values | ||
* @param dataArray | ||
*/ | ||
protected adjustDim(dim: string, values: number[], dataArray: Data[]): void; | ||
private getAdjustOffset; | ||
private adjustGroup; | ||
} |
@@ -5,16 +5,11 @@ "use strict"; | ||
var _ = require("@antv/util"); | ||
var constant_1 = require("../constant"); | ||
var adjust_1 = require("./adjust"); | ||
// 散点分开之后,距离边界的距离 | ||
var GAP = 0.05; | ||
function randomNumber(min, max) { | ||
return (max - min) * Math.random() + min; | ||
} | ||
var Jitter = /** @class */ (function (_super) { | ||
tslib_1.__extends(Jitter, _super); | ||
function Jitter(cfg) { | ||
var _this = _super.call(this, cfg) || this; | ||
_this.cfg = { | ||
adjustNames: ['x', 'y'], | ||
xField: '', | ||
yField: '', | ||
}; | ||
_this.cfg = tslib_1.__assign({}, _this.cfg, cfg); | ||
return _this; | ||
function Jitter() { | ||
return _super !== null && _super.apply(this, arguments) || this; | ||
} | ||
@@ -29,4 +24,15 @@ Jitter.prototype.process = function (groupDataArray) { | ||
}; | ||
Jitter.prototype.randomNumber = function (min, max) { | ||
return (max - min) * Math.random() + min; | ||
/** | ||
* 当前数据分组(index)中,按照维度 dim 进行 jitter 调整 | ||
* @param dim | ||
* @param values | ||
* @param dataArray | ||
*/ | ||
Jitter.prototype.adjustDim = function (dim, values, dataArray) { | ||
var _this = this; | ||
// 在每一个分组中,将数据再按照 dim 分组,用于散列 | ||
var groupDataArray = this.groupData(dataArray, dim); | ||
return _.each(groupDataArray, function (data, dimValue) { | ||
return _this.adjustGroup(data, dim, parseFloat(dimValue), values); | ||
}); | ||
}; | ||
@@ -37,7 +43,7 @@ // 随机出来的字段值 | ||
// 随机的范围 | ||
var margin = (next - pre) * GAP; | ||
return this.randomNumber(pre + margin, next - margin); | ||
var margin = (next - pre) * constant_1.GAP; | ||
return randomNumber(pre + margin, next - margin); | ||
}; | ||
// adjust group data | ||
Jitter.prototype._adjustGroup = function (group, dim, dimValue, values) { | ||
Jitter.prototype.adjustGroup = function (group, dim, dimValue, values) { | ||
var _this = this; | ||
@@ -47,6 +53,2 @@ // 调整范围 | ||
_.each(group, function (data) { | ||
// return { | ||
// ...data, | ||
// [dim]: this.getAdjustOffset(range); // 获取调整的位置 | ||
// } | ||
data[dim] = _this.getAdjustOffset(range); // 获取调整的位置 | ||
@@ -56,16 +58,2 @@ }); | ||
}; | ||
/** | ||
* 当前数据分组(index)中,按照维度 dim 进行 jitter 调整 | ||
* @param dim | ||
* @param values | ||
* @param dataArray | ||
*/ | ||
Jitter.prototype.adjustDim = function (dim, values, dataArray) { | ||
var _this = this; | ||
// 在每一个分组中,将数据再按照 dim 分组,用于散列 | ||
var groupDataArray = this.groupData(dataArray, dim); | ||
return _.each(groupDataArray, function (da, dimValue) { | ||
return _this._adjustGroup(da, dim, parseFloat(dimValue), values); | ||
}); | ||
}; | ||
return Jitter; | ||
@@ -72,0 +60,0 @@ }(adjust_1.default)); |
@@ -1,15 +0,16 @@ | ||
import { DataPointType, StackCfg } from '../interface'; | ||
import { Data, StackCfg } from '../interface'; | ||
import Adjust from './adjust'; | ||
export default class Stack extends Adjust { | ||
cfg: StackCfg; | ||
constructor(cfg: StackCfg); | ||
_reverse(groupedDataArray: DataPointType[][]): DataPointType[][]; | ||
/** | ||
* 方法入参是经过数据分组、数据数字化之后的二维数组 | ||
* @param groupDataArray 分组之后的数据 | ||
*/ | ||
process(groupDataArray: DataPointType[][]): DataPointType[][]; | ||
processStack(groupDataArray: DataPointType[][]): DataPointType[][]; | ||
processOneDimStack(groupDataArray: DataPointType[][]): DataPointType[][]; | ||
adjustDim(dim: string, values: number[], data: object[]): void; | ||
readonly height: number; | ||
readonly size: number; | ||
readonly reverseOrder: boolean; | ||
constructor(cfg: StackCfg); | ||
/** | ||
* 方法入参是经过数据分组、数据数字化之后的二维数组 | ||
* @param groupDataArray 分组之后的数据 | ||
*/ | ||
process(groupDataArray: Data[][]): Data[][]; | ||
private reverse; | ||
private processStack; | ||
private processOneDimStack; | ||
} |
@@ -11,16 +11,9 @@ "use strict"; | ||
var _this = _super.call(this, cfg) || this; | ||
_this.cfg = { | ||
adjustNames: ['y'], | ||
xField: '', | ||
yField: '', | ||
height: NaN, | ||
size: 10, | ||
reverseOrder: false, | ||
}; | ||
_this.cfg = tslib_1.__assign({}, _this.cfg, cfg); | ||
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; | ||
} | ||
Stack.prototype._reverse = function (groupedDataArray) { | ||
return groupedDataArray.slice(0).reverse(); | ||
}; | ||
/** | ||
@@ -31,12 +24,15 @@ * 方法入参是经过数据分组、数据数字化之后的二维数组 | ||
Stack.prototype.process = function (groupDataArray) { | ||
var _a = this.cfg, yField = _a.yField, reverseOrder = _a.reverseOrder; | ||
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; | ||
return reverseOrder ? this.reverse(d) : d; | ||
}; | ||
Stack.prototype.reverse = function (groupedDataArray) { | ||
return groupedDataArray.slice(0).reverse(); | ||
}; | ||
Stack.prototype.processStack = function (groupDataArray) { | ||
var _a = this.cfg, xField = _a.xField, yField = _a.yField, reverseOrder = _a.reverseOrder; | ||
var _a = this, xField = _a.xField, yField = _a.yField, reverseOrder = _a.reverseOrder; | ||
// 层叠顺序翻转 | ||
var groupedDataArray = reverseOrder ? this._reverse(groupDataArray) : groupDataArray; | ||
var groupedDataArray = reverseOrder ? this.reverse(groupDataArray) : groupDataArray; | ||
// 用来缓存,正数和负数的堆叠问题 | ||
@@ -62,3 +58,3 @@ var positive = new Cache(); | ||
cache.set(xKey, newXValue); | ||
return tslib_1.__assign({}, data, (_a = {}, _a[yField] = [xValue, newXValue], _a)); | ||
return tslib_1.__assign(tslib_1.__assign({}, data), (_a = {}, _a[yField] = [xValue, newXValue], _a)); | ||
} | ||
@@ -70,11 +66,8 @@ // 没有修改,则直接返回 | ||
}; | ||
// todo 不明白画出来是什么含义 | ||
Stack.prototype.processOneDimStack = function (groupDataArray) { | ||
var _this = this; | ||
var _a = this.cfg, xField = _a.xField, height = _a.height, reverseOrder = _a.reverseOrder; | ||
var yField = this.cfg.yField; | ||
// todo processOneDimStack 必然是 yField 不存在 | ||
yField = 'y'; | ||
var _a = this, xField = _a.xField, height = _a.height, reverseOrder = _a.reverseOrder; | ||
var yField = 'y'; | ||
// 如果层叠的顺序翻转 | ||
var groupedDataArray = reverseOrder ? this._reverse(groupDataArray) : groupDataArray; | ||
var groupedDataArray = reverseOrder ? this.reverse(groupDataArray) : groupDataArray; | ||
// 缓存累加数据 | ||
@@ -85,3 +78,3 @@ var cache = new Cache(); | ||
var _a; | ||
var size = _this.cfg.size; | ||
var size = _this.size; | ||
var xValue = data[xField]; | ||
@@ -96,8 +89,6 @@ // todo 没有看到这个 stack 计算原理 | ||
cache.set(xValue, stackValue + stackHeight); | ||
return tslib_1.__assign({}, data, (_a = {}, _a[yField] = stackValue, _a)); | ||
return tslib_1.__assign(tslib_1.__assign({}, data), (_a = {}, _a[yField] = stackValue, _a)); | ||
}); | ||
}); | ||
}; | ||
// 没有用到,空实现 | ||
Stack.prototype.adjustDim = function (dim, values, data) { }; | ||
return Stack; | ||
@@ -104,0 +95,0 @@ }(adjust_1.default)); |
@@ -1,14 +0,7 @@ | ||
import { DataPointType, SymmetricCfg } from '../interface'; | ||
import { Data } from '../interface'; | ||
import Adjust from './adjust'; | ||
export default class Symmetric extends Adjust { | ||
cfg: SymmetricCfg; | ||
constructor(cfg: SymmetricCfg); | ||
process(groupDataArray: DataPointType[][]): DataPointType[][]; | ||
_getXValuesMaxMap( | ||
mergeData: DataPointType[] | ||
): { | ||
[key: string]: number; | ||
}; | ||
_getDimMaxValue(mergeData: DataPointType[], dim: string): number; | ||
adjustDim(dim: string, values: number[], data: object[]): void; | ||
process(groupDataArray: Data[][]): Data[][]; | ||
private getXValuesMaxMap; | ||
private getDimMaxValue; | ||
} |
@@ -8,20 +8,11 @@ "use strict"; | ||
tslib_1.__extends(Symmetric, _super); | ||
function Symmetric(cfg) { | ||
var _this = _super.call(this, cfg) || this; | ||
_this.cfg = { | ||
adjustNames: [], | ||
xField: '', | ||
yField: '', | ||
}; | ||
_this.cfg = tslib_1.__assign({}, _this.cfg, cfg); | ||
return _this; | ||
function Symmetric() { | ||
return _super !== null && _super.apply(this, arguments) || this; | ||
} | ||
// 入口函数 | ||
Symmetric.prototype.process = function (groupDataArray) { | ||
var mergeData = _.flatten(groupDataArray); | ||
var _a = this.cfg, xField = _a.xField, yField = _a.yField; | ||
var _a = this, xField = _a.xField, yField = _a.yField; | ||
// 每个 x 值对应的 最大值 | ||
var cache = this._getXValuesMaxMap(mergeData); | ||
var cache = this.getXValuesMaxMap(mergeData); | ||
// 所有数据的最大的值 | ||
// const max = this._getDimMaxValue(mergeData, yField); | ||
var max = Math.max.apply(Math, Object.keys(cache).map(function (key) { return cache[key]; })); | ||
@@ -36,7 +27,7 @@ return _.map(groupDataArray, function (dataArray) { | ||
var off_1 = (max - cache[xValue]) / 2; | ||
return tslib_1.__assign({}, data, (_a = {}, _a[yField] = _.map(yValue, function (y) { return off_1 + y; }), _a)); | ||
return tslib_1.__assign(tslib_1.__assign({}, data), (_a = {}, _a[yField] = _.map(yValue, function (y) { return off_1 + y; }), _a)); | ||
} | ||
// 非数组处理逻辑 | ||
var offset = (max - yValue) / 2; | ||
return tslib_1.__assign({}, data, (_b = {}, _b[yField] = [offset, yValue + offset], _b)); | ||
return tslib_1.__assign(tslib_1.__assign({}, data), (_b = {}, _b[yField] = [offset, yValue + offset], _b)); | ||
}); | ||
@@ -46,11 +37,11 @@ }); | ||
// 获取每个 x 对应的最大的值 | ||
Symmetric.prototype._getXValuesMaxMap = function (mergeData) { | ||
Symmetric.prototype.getXValuesMaxMap = function (mergeData) { | ||
var _this = this; | ||
var _a = this.cfg, xField = _a.xField, yField = _a.yField; | ||
var _a = this, xField = _a.xField, yField = _a.yField; | ||
// 根据 xField 的值进行分组 | ||
var groupDataArray = _.groupBy(mergeData, function (data) { return data[xField]; }); | ||
// 获取每个 xField 值中的最大值 | ||
return _.mapValues(groupDataArray, function (dataArray) { return _this._getDimMaxValue(dataArray, yField); }); | ||
return _.mapValues(groupDataArray, function (dataArray) { return _this.getDimMaxValue(dataArray, yField); }); | ||
}; | ||
Symmetric.prototype._getDimMaxValue = function (mergeData, dim) { | ||
Symmetric.prototype.getDimMaxValue = function (mergeData, dim) { | ||
// 所有的 value 值 | ||
@@ -63,4 +54,2 @@ var dimValues = _.map(mergeData, function (data) { return _.get(data, dim, []); }); | ||
}; | ||
// 没有用到,空实现 | ||
Symmetric.prototype.adjustDim = function (dim, values, data) { }; | ||
return Symmetric; | ||
@@ -67,0 +56,0 @@ }(adjust_1.default)); |
@@ -1,43 +0,34 @@ | ||
export interface AdjustBaseCfg { | ||
readonly adjustNames: string[]; | ||
} | ||
export interface AdjustCfg { | ||
readonly adjustNames: string[]; | ||
readonly xField?: string; | ||
readonly yField?: string; | ||
readonly dodgeBy?: string; | ||
readonly marginRatio?: number; | ||
readonly dodgeRatio?: number; | ||
readonly size?: number; | ||
readonly height?: number; | ||
readonly reverseOrder?: boolean; | ||
readonly adjustNames?: string[]; | ||
readonly xField?: string; | ||
readonly yField?: string; | ||
readonly dodgeBy?: string; | ||
readonly marginRatio?: number; | ||
readonly dodgeRatio?: number; | ||
readonly size?: number; | ||
readonly height?: number; | ||
readonly reverseOrder?: boolean; | ||
} | ||
export interface DodgeCfg extends AdjustBaseCfg { | ||
readonly xField: string; | ||
readonly yField: string; | ||
readonly marginRatio: number; | ||
readonly dodgeRatio: number; | ||
readonly dodgeBy?: string; | ||
export interface DodgeCfg { | ||
readonly adjustNames?: string[]; | ||
readonly xField: string; | ||
readonly yField?: string; | ||
readonly marginRatio?: number; | ||
readonly dodgeRatio?: number; | ||
readonly dodgeBy?: string; | ||
} | ||
export interface JitterCfg extends AdjustBaseCfg { | ||
readonly xField: string; | ||
readonly yField: string; | ||
export interface StackCfg { | ||
readonly adjustNames?: string[]; | ||
readonly xField: string; | ||
readonly yField?: string; | ||
readonly height?: number; | ||
readonly size?: number; | ||
readonly reverseOrder?: boolean; | ||
} | ||
export interface StackCfg extends AdjustBaseCfg { | ||
readonly xField: string; | ||
readonly yField: string; | ||
readonly height: number; | ||
readonly size: number; | ||
readonly reverseOrder: boolean; | ||
export interface Data { | ||
[key: string]: any; | ||
} | ||
export interface SymmetricCfg extends AdjustBaseCfg { | ||
readonly xField: string; | ||
readonly yField: string; | ||
export interface Range { | ||
pre: number; | ||
next: number; | ||
} | ||
export interface DataPointType { | ||
[key: string]: any; | ||
} | ||
export interface RangeType { | ||
pre: number; | ||
next: number; | ||
} |
{ | ||
"name": "@antv/adjust", | ||
"version": "0.2.0", | ||
"version": "0.2.1-beta.1", | ||
"description": "The adjust module for G2, F2.", | ||
@@ -14,22 +14,8 @@ "main": "lib/index.js", | ||
], | ||
"devDependencies": { | ||
"@antv/scale": "~0.2.0", | ||
"@antv/torch": "~1.0.5", | ||
"chai": "~4.1.2", | ||
"husky": "^3.0.4", | ||
"npm-run-all": "^4.1.5", | ||
"prettier": "^1.18.2", | ||
"tslint": "^5.18.0", | ||
"tslint-config-prettier": "^1.18.0", | ||
"typescript": "^3.5.3", | ||
"rimraf": "^3.0.0" | ||
}, | ||
"scripts": { | ||
"clean": "rimraf lib esm", | ||
"lint": "run-s lint:*", | ||
"lint:tslint": "tslint -c tslint.json 'src/**/*.ts'", | ||
"lint:prettier": "prettier --list-different 'src/**/*.{ts,tsx,js,jsx}'", | ||
"test": "torch --renderer --compile --recursive ./__tests__/", | ||
"test-live": "torch --compile --interactive --watch --recursive ./__tests__/", | ||
"coverage": "exit 0", | ||
"lint": "lint-staged", | ||
"test": "jest", | ||
"test-live": "DEBUG_MODE=1 jest", | ||
"coverage": "jest --coverage", | ||
"lib:cjs": "tsc -p tsconfig.json --target ES5 --module commonjs --outDir lib", | ||
@@ -39,3 +25,4 @@ "lib:esm": "tsc -p tsconfig.json --target ES5 --module ESNext --outDir esm", | ||
"build": "run-s clean lib", | ||
"ci": "run-s lint build test" | ||
"ci": "run-s build coverage", | ||
"coveralls": "cat ./coverage/lcov.info | coveralls" | ||
}, | ||
@@ -46,2 +33,19 @@ "dependencies": { | ||
}, | ||
"devDependencies": { | ||
"@antv/scale": "~0.2.0", | ||
"@types/jest": "^24.0.18", | ||
"husky": "^3.0.4", | ||
"jest": "^24.9.0", | ||
"jest-electron": "^0.1.7", | ||
"jest-extended": "^0.11.2", | ||
"lint-staged": "^9.2.3", | ||
"npm-run-all": "^4.1.5", | ||
"prettier": "^1.18.2", | ||
"rimraf": "^3.0.0", | ||
"ts-jest": "^24.1.0", | ||
"tslint": "^5.18.0", | ||
"tslint-config-prettier": "^1.18.0", | ||
"typescript": "^3.5.3", | ||
"coveralls": "^3.0.6" | ||
}, | ||
"husky": { | ||
@@ -52,2 +56,25 @@ "hooks": { | ||
}, | ||
"lint-staged": { | ||
"*.{js,css,json,md}": [ | ||
"prettier --write", | ||
"git add" | ||
], | ||
"*.{ts}": [ | ||
"tslint -c tslint.json --fix", | ||
"prettier --write", | ||
"git add" | ||
] | ||
}, | ||
"jest": { | ||
"runner": "jest-electron/runner", | ||
"testEnvironment": "jest-electron/environment", | ||
"preset": "ts-jest", | ||
"collectCoverage": false, | ||
"collectCoverageFrom": [ | ||
"src/**/*.{ts,js}", | ||
"!**/node_modules/**", | ||
"!**/vendor/**" | ||
], | ||
"testRegex": "/tests/.*-spec\\.ts?$" | ||
}, | ||
"repository": { | ||
@@ -54,0 +81,0 @@ "type": "git", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
58
0
80367
15
1211