UNPKG

30.6 kBJavaScriptView Raw
1(function webpackUniversalModuleDefinition(root, factory) {
2 if(typeof exports === 'object' && typeof module === 'object')
3 module.exports = factory();
4 else if(typeof define === 'function' && define.amd)
5 define([], factory);
6 else if(typeof exports === 'object')
7 exports["adjust"] = factory();
8 else
9 root["adjust"] = factory();
10})(typeof self !== 'undefined' ? self : this, function() {
11return /******/ (function(modules) { // webpackBootstrap
12/******/ // The module cache
13/******/ var installedModules = {};
14/******/
15/******/ // The require function
16/******/ function __webpack_require__(moduleId) {
17/******/
18/******/ // Check if module is in cache
19/******/ if(installedModules[moduleId]) {
20/******/ return installedModules[moduleId].exports;
21/******/ }
22/******/ // Create a new module (and put it into the cache)
23/******/ var module = installedModules[moduleId] = {
24/******/ i: moduleId,
25/******/ l: false,
26/******/ exports: {}
27/******/ };
28/******/
29/******/ // Execute the module function
30/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
31/******/
32/******/ // Flag the module as loaded
33/******/ module.l = true;
34/******/
35/******/ // Return the exports of the module
36/******/ return module.exports;
37/******/ }
38/******/
39/******/
40/******/ // expose the modules object (__webpack_modules__)
41/******/ __webpack_require__.m = modules;
42/******/
43/******/ // expose the module cache
44/******/ __webpack_require__.c = installedModules;
45/******/
46/******/ // define getter function for harmony exports
47/******/ __webpack_require__.d = function(exports, name, getter) {
48/******/ if(!__webpack_require__.o(exports, name)) {
49/******/ Object.defineProperty(exports, name, {
50/******/ configurable: false,
51/******/ enumerable: true,
52/******/ get: getter
53/******/ });
54/******/ }
55/******/ };
56/******/
57/******/ // getDefaultExport function for compatibility with non-harmony modules
58/******/ __webpack_require__.n = function(module) {
59/******/ var getter = module && module.__esModule ?
60/******/ function getDefault() { return module['default']; } :
61/******/ function getModuleExports() { return module; };
62/******/ __webpack_require__.d(getter, 'a', getter);
63/******/ return getter;
64/******/ };
65/******/
66/******/ // Object.prototype.hasOwnProperty.call
67/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
68/******/
69/******/ // __webpack_public_path__
70/******/ __webpack_require__.p = "";
71/******/
72/******/ // Load entry module and return exports
73/******/ return __webpack_require__(__webpack_require__.s = 10);
74/******/ })
75/************************************************************************/
76/******/ ([
77/* 0 */
78/***/ (function(module, exports, __webpack_require__) {
79
80var isObject = __webpack_require__(12);
81var isArray = __webpack_require__(1);
82
83var each = function each(elements, func) {
84 if (!elements) {
85 return;
86 }
87 var rst = void 0;
88 if (isArray(elements)) {
89 for (var i = 0, len = elements.length; i < len; i++) {
90 rst = func(elements[i], i);
91 if (rst === false) {
92 break;
93 }
94 }
95 } else if (isObject(elements)) {
96 for (var k in elements) {
97 if (elements.hasOwnProperty(k)) {
98 rst = func(elements[k], k);
99 if (rst === false) {
100 break;
101 }
102 }
103 }
104 }
105};
106
107module.exports = each;
108
109/***/ }),
110/* 1 */
111/***/ (function(module, exports, __webpack_require__) {
112
113var isType = __webpack_require__(6);
114
115var isArray = Array.isArray ? Array.isArray : function (value) {
116 return isType(value, 'Array');
117};
118
119module.exports = isArray;
120
121/***/ }),
122/* 2 */
123/***/ (function(module, exports, __webpack_require__) {
124
125function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
126
127var mix = __webpack_require__(4);
128
129var Adjust = function () {
130 Adjust.prototype._initDefaultCfg = function _initDefaultCfg() {
131 this.adjustNames = ['x', 'y']; // 调整的维度,默认,x,y都做调整
132 };
133
134 function Adjust(cfg) {
135 _classCallCheck(this, Adjust);
136
137 this._initDefaultCfg();
138 mix(this, cfg);
139 }
140
141 /**
142 * @override
143 */
144
145
146 Adjust.prototype.processAdjust = function processAdjust() /* dataArray */{};
147
148 return Adjust;
149}();
150
151module.exports = Adjust;
152
153/***/ }),
154/* 3 */
155/***/ (function(module, exports, __webpack_require__) {
156
157var each = __webpack_require__(0);
158var isNil = __webpack_require__(7);
159var isArray = __webpack_require__(1);
160
161var values = function values(data, name) {
162 var rst = [];
163 var tmpMap = {};
164 for (var i = 0; i < data.length; i++) {
165 var obj = data[i];
166 var value = obj[name];
167 if (!isNil(value)) {
168 if (!isArray(value)) {
169 value = [value];
170 }
171 each(value, function (val) {
172 if (!tmpMap[val]) {
173 rst.push(val);
174 tmpMap[val] = true;
175 }
176 });
177 }
178 }
179 return rst;
180};
181
182module.exports = values;
183
184/***/ }),
185/* 4 */
186/***/ (function(module, exports) {
187
188function _mix(dist, obj) {
189 for (var key in obj) {
190 if (obj.hasOwnProperty(key) && key !== 'constructor' && obj[key] !== undefined) {
191 dist[key] = obj[key];
192 }
193 }
194}
195
196var mix = function mix(dist, src1, src2, src3) {
197 if (src1) _mix(dist, src1);
198 if (src2) _mix(dist, src2);
199 if (src3) _mix(dist, src3);
200 return dist;
201};
202
203module.exports = mix;
204
205/***/ }),
206/* 5 */
207/***/ (function(module, exports) {
208
209var merge = function merge(dataArray) {
210 var rst = [];
211 for (var i = 0; i < dataArray.length; i++) {
212 rst = rst.concat(dataArray[i]);
213 }
214 return rst;
215};
216
217module.exports = merge;
218
219/***/ }),
220/* 6 */
221/***/ (function(module, exports) {
222
223var toString = {}.toString;
224var isType = function isType(value, type) {
225 return toString.call(value) === '[object ' + type + ']';
226};
227
228module.exports = isType;
229
230/***/ }),
231/* 7 */
232/***/ (function(module, exports) {
233
234// isFinite,
235var isNil = function isNil(value) {
236 /**
237 * isNil(null) => true
238 * isNil() => true
239 */
240 return value === null || value === undefined;
241};
242
243module.exports = isNil;
244
245/***/ }),
246/* 8 */
247/***/ (function(module, exports, __webpack_require__) {
248
249var DEFAULT_Y = 0; // 默认的y的值
250var each = __webpack_require__(0);
251var ArrayUtil = {
252 values: __webpack_require__(3)
253};
254module.exports = {
255 /**
256 * 对应的维度是否可以调整
257 * @protected
258 * @param {String} dimName 可以调整的维度 x,y
259 * @return {Boolean} 是否可以调整
260 */
261 isAdjust: function isAdjust(dimName) {
262 return this.adjustNames.indexOf(dimName) >= 0;
263 },
264
265 /**
266 * @protected
267 * 获取可调整度量对应的值
268 * @param {Frame} mergeData 数据
269 * @return {Object} 值的映射
270 */
271 _getDimValues: function _getDimValues(mergeData) {
272 var self = this;
273 var valuesMap = {};
274 var dims = [];
275 if (self.xField && self.isAdjust('x')) {
276 dims.push(self.xField);
277 }
278 if (self.yField && self.isAdjust('y')) {
279 dims.push(self.yField);
280 }
281 each(dims, function (dim) {
282 var values = ArrayUtil.values(mergeData, dim);
283 values.sort(function (v1, v2) {
284 return v1 - v2;
285 });
286 valuesMap[dim] = values;
287 });
288 if (!self.yField && self.isAdjust('y')) {
289 // 只有一维的情况下,同时调整y
290 var dim = 'y';
291 var values = [DEFAULT_Y, 1]; // 默认分布在y轴的 0.1 与 0.2 之间
292 valuesMap[dim] = values;
293 }
294 return valuesMap;
295 },
296 adjustData: function adjustData(dataArray, mergeData) {
297 var self = this;
298 var valuesMap = self._getDimValues(mergeData);
299 each(dataArray, function (data, index) {
300 // 遍历所有数据集合
301 each(valuesMap, function (values, dim) {
302 // 根据不同的度量分别调整位置
303 self.adjustDim(dim, values, data, dataArray.length, index);
304 });
305 });
306 },
307 getAdjustRange: function getAdjustRange(dim, key, values) {
308 var self = this;
309 var index = values.indexOf(key);
310 var length = values.length;
311 var pre = void 0;
312 var next = void 0;
313 if (!self.yField && self.isAdjust('y')) {
314 pre = 0;
315 next = 1;
316 } else if (length > 1) {
317 pre = index === 0 ? values[0] : values[index - 1];
318 next = index === length - 1 ? values[length - 1] : values[index + 1];
319
320 if (index !== 0) {
321 pre += (key - pre) / 2;
322 } else {
323 pre -= (next - key) / 2;
324 }
325 if (index !== length - 1) {
326 next -= (next - key) / 2;
327 } else {
328 next += (key - values[length - 2]) / 2;
329 }
330 } else {
331 pre = key === 0 ? 0 : key - 0.5;
332 next = key === 0 ? 1 : key + 0.5;
333 }
334
335 return {
336 pre: pre,
337 next: next
338 };
339 },
340
341 /**
342 * 对数据进行分组
343 * @param {Array} data 数据
344 * @param {String} dim 分组的字段
345 * @return {Object} 分组的键值对映射
346 */
347 groupData: function groupData(data, dim) {
348 var groups = {};
349
350 each(data, function (record) {
351 var value = record[dim];
352 if (value === undefined) {
353 value = record[dim] = DEFAULT_Y;
354 }
355 if (!groups[value]) {
356 groups[value] = [];
357 }
358 groups[value].push(record);
359 });
360
361 return groups;
362 }
363};
364
365/***/ }),
366/* 9 */
367/***/ (function(module, exports, __webpack_require__) {
368
369/**
370 * 是否为函数
371 * @param {*} fn 对象
372 * @return {Boolean} 是否函数
373 */
374var isType = __webpack_require__(6);
375
376var isFunction = function isFunction(value) {
377 return isType(value, 'Function');
378};
379
380module.exports = isFunction;
381
382/***/ }),
383/* 10 */
384/***/ (function(module, exports, __webpack_require__) {
385
386// 完整版下使用支持按照某个字段进行分组的 dodge
387var mix = __webpack_require__(4);
388var Adjust = __webpack_require__(2);
389var Dodge = __webpack_require__(11);
390var Stack = __webpack_require__(13);
391var AdjustMixin = __webpack_require__(8);
392var DodgeMixin = __webpack_require__(14);
393var StackMixin = __webpack_require__(18);
394mix(Adjust.prototype, AdjustMixin);
395mix(Dodge.prototype, AdjustMixin, DodgeMixin);
396mix(Stack.prototype, StackMixin);
397
398Adjust.Jitter = __webpack_require__(19);
399Adjust.Symmetric = __webpack_require__(20);
400Adjust.Dodge = Dodge;
401Adjust.Stack = Stack;
402
403module.exports = Adjust;
404
405/***/ }),
406/* 11 */
407/***/ (function(module, exports, __webpack_require__) {
408
409function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
410
411function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
412
413function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
414
415var Adjust = __webpack_require__(2);
416var each = __webpack_require__(0);
417
418var MARGIN_RATIO = 1 / 2;
419var DODGE_RATIO = 1 / 2;
420
421var Dodge = function (_Adjust) {
422 _inherits(Dodge, _Adjust);
423
424 function Dodge() {
425 _classCallCheck(this, Dodge);
426
427 return _possibleConstructorReturn(this, _Adjust.apply(this, arguments));
428 }
429
430 Dodge.prototype._initDefaultCfg = function _initDefaultCfg() {
431 /**
432 * 调整过程中,2个数据的间距
433 * @type {Number}
434 */
435 this.marginRatio = MARGIN_RATIO;
436 /**
437 * 调整占单位宽度的比例,例如:占2个分类间距的 1/2
438 * @type {Number}
439 */
440 this.dodgeRatio = DODGE_RATIO;
441 this.adjustNames = ['x', 'y']; // 调整的维度,默认,x,y都做调整
442 };
443
444 Dodge.prototype.getDodgeOffset = function getDodgeOffset(range, index, count) {
445 var self = this;
446 var pre = range.pre;
447 var next = range.next;
448 var tickLength = next - pre;
449 var width = tickLength * self.dodgeRatio / count;
450 var margin = self.marginRatio * width;
451 var offset = 1 / 2 * (tickLength - count * width - (count - 1) * margin) + ((index + 1) * width + index * margin) - 1 / 2 * width - 1 / 2 * tickLength;
452 return (pre + next) / 2 + offset;
453 };
454
455 Dodge.prototype.processAdjust = function processAdjust(dataArray) {
456 var self = this;
457 var count = dataArray.length;
458 var xField = self.xField;
459 each(dataArray, function (data, index) {
460 for (var i = 0, len = data.length; i < len; i++) {
461 var obj = data[i];
462 var value = obj[xField];
463 var range = {
464 pre: value - 0.5,
465 next: value + 0.5
466 };
467 var dodgeValue = self.getDodgeOffset(range, index, count);
468 obj[xField] = dodgeValue;
469 }
470 });
471 };
472
473 return Dodge;
474}(Adjust);
475
476Adjust.Dodge = Dodge;
477module.exports = Dodge;
478
479/***/ }),
480/* 12 */
481/***/ (function(module, exports) {
482
483var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
484
485var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
486 return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
487} : function (obj) {
488 return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
489};
490
491var isObject = function isObject(value) {
492 /**
493 * isObject({}) => true
494 * isObject([1, 2, 3]) => true
495 * isObject(Function) => true
496 * isObject(null) => false
497 */
498 var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);
499 return value !== null && type === 'object' || type === 'function';
500};
501
502module.exports = isObject;
503
504/***/ }),
505/* 13 */
506/***/ (function(module, exports, __webpack_require__) {
507
508function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
509
510function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
511
512function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
513
514var isArray = __webpack_require__(1);
515var isNil = __webpack_require__(7);
516var Adjust = __webpack_require__(2);
517
518var Stack = function (_Adjust) {
519 _inherits(Stack, _Adjust);
520
521 function Stack() {
522 _classCallCheck(this, Stack);
523
524 return _possibleConstructorReturn(this, _Adjust.apply(this, arguments));
525 }
526
527 Stack.prototype._initDefaultCfg = function _initDefaultCfg() {
528 this.xField = null; // 调整对应的 x 方向对应的字段名称
529 this.yField = null; // 调整对应的 y 方向对应的字段名称
530 };
531
532 Stack.prototype.processAdjust = function processAdjust(dataArray) {
533 this.processStack(dataArray);
534 };
535
536 Stack.prototype.processStack = function processStack(dataArray) {
537 var self = this;
538 var xField = self.xField;
539 var yField = self.yField;
540 var count = dataArray.length;
541 var stackCache = {
542 positive: {},
543 negative: {}
544 };
545 // 层叠顺序翻转
546 if (self.reverseOrder) {
547 dataArray = dataArray.slice(0).reverse();
548 }
549 for (var i = 0; i < count; i++) {
550 var data = dataArray[i];
551 for (var j = 0, len = data.length; j < len; j++) {
552 var item = data[j];
553 var x = item[xField] || 0;
554 var y = item[yField];
555 var xkey = x.toString();
556 y = isArray(y) ? y[1] : y;
557 if (!isNil(y)) {
558 var direction = y >= 0 ? 'positive' : 'negative';
559 if (!stackCache[direction][xkey]) {
560 stackCache[direction][xkey] = 0;
561 }
562 item[yField] = [stackCache[direction][xkey], y + stackCache[direction][xkey]];
563 stackCache[direction][xkey] += y;
564 }
565 }
566 }
567 };
568
569 return Stack;
570}(Adjust);
571
572Adjust.Stack = Stack;
573module.exports = Stack;
574
575/***/ }),
576/* 14 */
577/***/ (function(module, exports, __webpack_require__) {
578
579var ArrayUtil = {
580 merge: __webpack_require__(5),
581 values: __webpack_require__(3)
582};
583
584var group = __webpack_require__(15);
585var each = __webpack_require__(0);
586
587module.exports = {
588 /**
589 * @protected
590 * @override
591 */
592 processAdjust: function processAdjust(dataArray) {
593 var self = this;
594 var mergeData = ArrayUtil.merge(dataArray);
595 var dodgeDim = self.dodgeBy;
596 var adjDataArray = dataArray;
597 if (dodgeDim) {
598 // 如果指定了分组dim的字段
599 adjDataArray = group(mergeData, dodgeDim);
600 }
601 self.cacheMap = {};
602 self.adjDataArray = adjDataArray;
603 self.mergeData = mergeData;
604 self.adjustData(adjDataArray, mergeData);
605
606 self.adjDataArray = null;
607 self.mergeData = null;
608 },
609 getDistribution: function getDistribution(dim) {
610 var self = this;
611 var dataArray = self.adjDataArray;
612 var cacheMap = self.cacheMap;
613 var map = cacheMap[dim];
614 if (!map) {
615 map = {};
616 each(dataArray, function (data, index) {
617 var values = ArrayUtil.values(data, dim);
618 if (!values.length) {
619 values.push(0);
620 }
621 each(values, function (val) {
622 if (!map[val]) {
623 map[val] = [];
624 }
625 map[val].push(index);
626 });
627 });
628 cacheMap[dim] = map;
629 }
630
631 return map;
632 },
633 adjustDim: function adjustDim(dim, values, data, frameCount, frameIndex) {
634 var self = this;
635 var map = self.getDistribution(dim);
636 var groupData = self.groupData(data, dim); // 根据值分组
637
638 each(groupData, function (group, key) {
639 key = parseFloat(key);
640 var range = void 0;
641 if (values.length === 1) {
642 range = {
643 pre: values[0] - 1,
644 next: values[0] + 1
645 };
646 } else {
647 range = self.getAdjustRange(dim, key, values);
648 }
649 each(group, function (record) {
650 var value = record[dim];
651 var valueArr = map[value];
652 var valIndex = valueArr.indexOf(frameIndex);
653 record[dim] = self.getDodgeOffset(range, valIndex, valueArr.length);
654 });
655 });
656 }
657};
658
659/***/ }),
660/* 15 */
661/***/ (function(module, exports, __webpack_require__) {
662
663var groupToMap = __webpack_require__(16);
664
665var group = function group(data, condition) {
666 if (!condition) {
667 return [data];
668 }
669 var groups = groupToMap(data, condition);
670 var array = [];
671 for (var i in groups) {
672 array.push(groups[i]);
673 }
674 return array;
675};
676
677module.exports = group;
678
679/***/ }),
680/* 16 */
681/***/ (function(module, exports, __webpack_require__) {
682
683var isFunction = __webpack_require__(9);
684var isArray = __webpack_require__(1);
685var groupBy = __webpack_require__(17);
686
687var groupToMap = function groupToMap(data, condition) {
688 if (!condition) {
689 return {
690 0: data
691 };
692 }
693 if (!isFunction(condition)) {
694 var paramsCondition = isArray(condition) ? condition : condition.replace(/\s+/g, '').split('*');
695 condition = function condition(row) {
696 var unique = '_'; // 避免出现数字作为Key的情况,会进行按照数字的排序
697 for (var i = 0, l = paramsCondition.length; i < l; i++) {
698 unique += row[paramsCondition[i]] && row[paramsCondition[i]].toString();
699 }
700 return unique;
701 };
702 }
703 var groups = groupBy(data, condition);
704 return groups;
705};
706
707module.exports = groupToMap;
708
709/***/ }),
710/* 17 */
711/***/ (function(module, exports, __webpack_require__) {
712
713var each = __webpack_require__(0);
714var isArray = __webpack_require__(1);
715var hasOwnProperty = Object.prototype.hasOwnProperty;
716var groupBy = function groupBy(data, condition) {
717 if (!condition || !isArray(data)) {
718 return data;
719 }
720 var result = {};
721 var key = null;
722 each(data, function (item) {
723 key = condition(item);
724 if (hasOwnProperty.call(result, key)) {
725 result[key].push(item);
726 } else {
727 result[key] = [item];
728 }
729 });
730 return result;
731};
732
733module.exports = groupBy;
734
735/***/ }),
736/* 18 */
737/***/ (function(module, exports) {
738
739module.exports = {
740 _initDefaultCfg: function _initDefaultCfg() {
741 this.xField = null; // 调整对应的 x 方向对应的字段名称
742 this.yField = null; // 调整对应的 y 方向对应的字段名称
743 this.height = null; // 仅有一个维度调整时,总的高度
744 this.size = 10; // 单个点的大小
745 this.reverseOrder = false; // 是否反序进行层叠
746 this.adjustNames = ['y']; // Only support stack y
747 },
748 processOneDimStack: function processOneDimStack(dataArray) {
749 var self = this;
750 var xField = self.xField;
751 var yField = self.yField || 'y';
752 var height = self.height;
753
754 var stackY = {};
755 // 如果层叠的顺序翻转
756 if (self.reverseOrder) {
757 dataArray = dataArray.slice(0).reverse();
758 }
759 for (var i = 0, len = dataArray.length; i < len; i++) {
760 var data = dataArray[i];
761 // cates
762 for (var j = 0, dataLen = data.length; j < dataLen; j++) {
763 var item = data[j];
764 var size = item.size || self.size;
765 var stackHeight = size * 2 / height;
766 var x = item[xField];
767 if (!stackY[x]) {
768 stackY[x] = stackHeight / 2;
769 }
770 item[yField] = stackY[x];
771 stackY[x] += stackHeight;
772 }
773 }
774 },
775 processAdjust: function processAdjust(dataArray) {
776 if (this.yField) {
777 this.processStack(dataArray);
778 } else {
779 this.processOneDimStack(dataArray);
780 }
781 }
782};
783
784/***/ }),
785/* 19 */
786/***/ (function(module, exports, __webpack_require__) {
787
788function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
789
790function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
791
792function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
793
794var each = __webpack_require__(0);
795var mix = __webpack_require__(4);
796var ArrayUtil = {
797 merge: __webpack_require__(5),
798 values: __webpack_require__(3)
799};
800
801var Adjust = __webpack_require__(2);
802var AdjustMixin = __webpack_require__(8);
803
804var Jitter = function (_Adjust) {
805 _inherits(Jitter, _Adjust);
806
807 function Jitter() {
808 _classCallCheck(this, Jitter);
809
810 return _possibleConstructorReturn(this, _Adjust.apply(this, arguments));
811 }
812
813 Jitter.prototype._initDefaultCfg = function _initDefaultCfg() {
814 this.xField = null; // 调整对应的 x 方向对应的字段名称
815 this.yField = null; // 调整对应的 y 方向对应的字段名称
816 this.adjustNames = ['x', 'y']; // 指x,y
817 this.groupFields = null; // 参与分组的数据维度
818 };
819
820 Jitter.prototype.processAdjust = function processAdjust(dataArray) {
821 var self = this;
822 var mergeData = ArrayUtil.merge(dataArray);
823
824 self.adjDataArray = dataArray;
825 self.mergeData = mergeData;
826 self.adjustData(dataArray, mergeData);
827 self.adjFrames = null;
828 self.mergeData = null;
829 };
830
831 Jitter.prototype.getAdjustOffset = function getAdjustOffset(pre, next) {
832 var r = Math.random(); // 随机位置,均匀分布
833 var avg = next - pre; // * length
834 var append = avg * 0.05;
835 return pre + append + avg * 0.9 * r;
836 };
837
838 // adjust group data
839
840
841 Jitter.prototype._adjustGroup = function _adjustGroup(group, dim, key, values) {
842 var self = this;
843 var range = self.getAdjustRange(dim, key, values);
844
845 each(group, function (record) {
846 record[dim] = self.getAdjustOffset(range.pre, range.next); // 获取调整的位置
847 });
848 };
849
850 Jitter.prototype.adjustDim = function adjustDim(dim, values, data) {
851 var self = this;
852 var groupData = self.groupData(data, dim);
853 each(groupData, function (group, key) {
854 key = parseFloat(key);
855 self._adjustGroup(group, dim, key, values);
856 });
857 };
858
859 return Jitter;
860}(Adjust);
861
862mix(Jitter.prototype, AdjustMixin);
863
864Adjust.Jitter = Jitter;
865module.exports = Jitter;
866
867/***/ }),
868/* 20 */
869/***/ (function(module, exports, __webpack_require__) {
870
871function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
872
873function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
874
875function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
876
877var each = __webpack_require__(0);
878var maxBy = __webpack_require__(21);
879var isArray = __webpack_require__(1);
880var ArrayUtil = {
881 merge: __webpack_require__(5),
882 values: __webpack_require__(3)
883};
884var Adjust = __webpack_require__(2);
885
886var Symmetric = function (_Adjust) {
887 _inherits(Symmetric, _Adjust);
888
889 function Symmetric() {
890 _classCallCheck(this, Symmetric);
891
892 return _possibleConstructorReturn(this, _Adjust.apply(this, arguments));
893 }
894
895 Symmetric.prototype._initDefaultCfg = function _initDefaultCfg() {
896 this.xField = null; // 调整对应的 x 方向对应的字段名称
897 this.yField = null; // 调整对应的 y 方向对应的字段名称
898 this.cacheMax = null; // 缓存的最大值
899 this.adjustNames = ['y']; // Only support stack y
900 this.groupFields = null; // 参与分组的数据维度
901 };
902
903 // 获取最大的y值
904
905
906 Symmetric.prototype._getMax = function _getMax(dim) {
907 var self = this;
908 var mergeData = self.mergeData;
909 var maxRecord = maxBy(mergeData, function (obj) {
910 var value = obj[dim];
911 if (isArray(value)) {
912 return Math.max.apply(null, value);
913 }
914 return value;
915 });
916 var maxValue = maxRecord[dim];
917 var max = isArray(maxValue) ? Math.max.apply(null, maxValue) : maxValue;
918 return max;
919 };
920
921 // 获取每个字段最大的值
922
923
924 Symmetric.prototype._getXValuesMax = function _getXValuesMax() {
925 var self = this;
926 var yField = self.yField;
927 var xField = self.xField;
928 var cache = {};
929 var mergeData = self.mergeData;
930 each(mergeData, function (obj) {
931 var xValue = obj[xField];
932 var yValue = obj[yField];
933 var max = isArray(yValue) ? Math.max.apply(null, yValue) : yValue;
934 cache[xValue] = cache[xValue] || 0;
935 if (cache[xValue] < max) {
936 cache[xValue] = max;
937 }
938 });
939 return cache;
940 };
941
942 // 入口函数
943
944
945 Symmetric.prototype.processAdjust = function processAdjust(dataArray) {
946 var self = this;
947 var mergeData = ArrayUtil.merge(dataArray);
948 self.mergeData = mergeData;
949 self._processSymmetric(dataArray);
950 self.mergeData = null;
951 };
952
953 // 处理对称
954
955
956 Symmetric.prototype._processSymmetric = function _processSymmetric(dataArray) {
957 var self = this;
958 var xField = self.xField;
959 var yField = self.yField;
960 var max = self._getMax(yField);
961 var first = dataArray[0][0];
962
963 var cache = void 0;
964 if (first && isArray(first[yField])) {
965 cache = self._getXValuesMax();
966 }
967 each(dataArray, function (data) {
968 each(data, function (obj) {
969 var value = obj[yField];
970 var offset = void 0;
971 if (isArray(value)) {
972 var xValue = obj[xField];
973 var valueMax = cache[xValue];
974 offset = (max - valueMax) / 2;
975 var tmp = [];
976 /* eslint-disable no-loop-func */
977 each(value, function (subVal) {
978 // 多个字段
979 tmp.push(offset + subVal);
980 });
981 /* eslint-enable no-loop-func */
982 obj[yField] = tmp;
983 } else {
984 offset = (max - value) / 2;
985 obj[yField] = [offset, value + offset];
986 }
987 });
988 });
989 };
990
991 return Symmetric;
992}(Adjust);
993
994Adjust.Symmetric = Symmetric;
995module.exports = Symmetric;
996
997/***/ }),
998/* 21 */
999/***/ (function(module, exports, __webpack_require__) {
1000
1001var isArray = __webpack_require__(1);
1002var isFunction = __webpack_require__(9);
1003var each = __webpack_require__(0);
1004/**
1005 * @param {Array} arr The array to iterate over.
1006 * @param {Function} [fn] The iteratee invoked per element.
1007 * @return {*} Returns the maximum value.
1008 * @example
1009 *
1010 * var objects = [{ 'n': 1 }, { 'n': 2 }];
1011 *
1012 * maxBy(objects, function(o) { return o.n; });
1013 * // => { 'n': 2 }
1014 *
1015 * maxBy(objects, 'n');
1016 * // => { 'n': 2 }
1017 */
1018var maxBy = function maxBy(arr, fn) {
1019 if (!isArray(arr)) {
1020 return undefined;
1021 }
1022 var max = arr[0];
1023 var maxData = void 0;
1024 if (isFunction(fn)) {
1025 maxData = fn(arr[0]);
1026 } else {
1027 maxData = arr[0][fn];
1028 }
1029 var data = void 0;
1030 each(arr, function (val) {
1031 if (isFunction(fn)) {
1032 data = fn(val);
1033 } else {
1034 data = val[fn];
1035 }
1036 if (data > maxData) {
1037 max = val;
1038 maxData = data;
1039 }
1040 });
1041 return max;
1042};
1043
1044module.exports = maxBy;
1045
1046/***/ })
1047/******/ ]);
1048});
1049//# sourceMappingURL=adjust.js.map
\No newline at end of file