adjust.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131
  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() {
  11. return /******/ (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. var isObject = __webpack_require__(12);
  80. var isArray = __webpack_require__(1);
  81. var each = function each(elements, func) {
  82. if (!elements) {
  83. return;
  84. }
  85. var rst = void 0;
  86. if (isArray(elements)) {
  87. for (var i = 0, len = elements.length; i < len; i++) {
  88. rst = func(elements[i], i);
  89. if (rst === false) {
  90. break;
  91. }
  92. }
  93. } else if (isObject(elements)) {
  94. for (var k in elements) {
  95. if (elements.hasOwnProperty(k)) {
  96. rst = func(elements[k], k);
  97. if (rst === false) {
  98. break;
  99. }
  100. }
  101. }
  102. }
  103. };
  104. module.exports = each;
  105. /***/ }),
  106. /* 1 */
  107. /***/ (function(module, exports, __webpack_require__) {
  108. var isType = __webpack_require__(5);
  109. var isArray = Array.isArray ? Array.isArray : function (value) {
  110. return isType(value, 'Array');
  111. };
  112. module.exports = isArray;
  113. /***/ }),
  114. /* 2 */
  115. /***/ (function(module, exports, __webpack_require__) {
  116. var mix = __webpack_require__(3);
  117. var Adjust =
  118. /*#__PURE__*/
  119. function () {
  120. var _proto = Adjust.prototype;
  121. _proto._initDefaultCfg = function _initDefaultCfg() {
  122. this.adjustNames = ['x', 'y']; // 调整的维度,默认,x,y都做调整
  123. };
  124. function Adjust(cfg) {
  125. this._initDefaultCfg();
  126. mix(this, cfg);
  127. }
  128. /**
  129. * @override
  130. */
  131. _proto.processAdjust = function processAdjust()
  132. /* dataArray */
  133. {};
  134. return Adjust;
  135. }();
  136. module.exports = Adjust;
  137. /***/ }),
  138. /* 3 */
  139. /***/ (function(module, exports) {
  140. function _mix(dist, obj) {
  141. for (var key in obj) {
  142. if (obj.hasOwnProperty(key) && key !== 'constructor' && obj[key] !== undefined) {
  143. dist[key] = obj[key];
  144. }
  145. }
  146. }
  147. var mix = function mix(dist, src1, src2, src3) {
  148. if (src1) _mix(dist, src1);
  149. if (src2) _mix(dist, src2);
  150. if (src3) _mix(dist, src3);
  151. return dist;
  152. };
  153. module.exports = mix;
  154. /***/ }),
  155. /* 4 */
  156. /***/ (function(module, exports) {
  157. var merge = function merge(dataArray) {
  158. var rst = [];
  159. for (var i = 0; i < dataArray.length; i++) {
  160. rst = rst.concat(dataArray[i]);
  161. }
  162. return rst;
  163. };
  164. module.exports = merge;
  165. /***/ }),
  166. /* 5 */
  167. /***/ (function(module, exports) {
  168. var toString = {}.toString;
  169. var isType = function isType(value, type) {
  170. return toString.call(value) === '[object ' + type + ']';
  171. };
  172. module.exports = isType;
  173. /***/ }),
  174. /* 6 */
  175. /***/ (function(module, exports) {
  176. // isFinite,
  177. var isNil = function isNil(value) {
  178. /**
  179. * isNil(null) => true
  180. * isNil() => true
  181. */
  182. return value === null || value === undefined;
  183. };
  184. module.exports = isNil;
  185. /***/ }),
  186. /* 7 */
  187. /***/ (function(module, exports, __webpack_require__) {
  188. var DEFAULT_Y = 0; // 默认的y的值
  189. var each = __webpack_require__(0);
  190. var ArrayUtil = {
  191. values: __webpack_require__(8)
  192. };
  193. module.exports = {
  194. /**
  195. * 对应的维度是否可以调整
  196. * @protected
  197. * @param {String} dimName 可以调整的维度 x,y
  198. * @return {Boolean} 是否可以调整
  199. */
  200. isAdjust: function isAdjust(dimName) {
  201. return this.adjustNames.indexOf(dimName) >= 0;
  202. },
  203. /**
  204. * @protected
  205. * 获取可调整度量对应的值
  206. * @param {Frame} mergeData 数据
  207. * @return {Object} 值的映射
  208. */
  209. _getDimValues: function _getDimValues(mergeData) {
  210. var self = this;
  211. var valuesMap = {};
  212. var dims = [];
  213. if (self.xField && self.isAdjust('x')) {
  214. dims.push(self.xField);
  215. }
  216. if (self.yField && self.isAdjust('y')) {
  217. dims.push(self.yField);
  218. }
  219. each(dims, function (dim) {
  220. var values = ArrayUtil.values(mergeData, dim);
  221. values.sort(function (v1, v2) {
  222. return v1 - v2;
  223. });
  224. valuesMap[dim] = values;
  225. });
  226. if (!self.yField && self.isAdjust('y')) {
  227. // 只有一维的情况下,同时调整y
  228. var dim = 'y';
  229. var values = [DEFAULT_Y, 1]; // 默认分布在y轴的 0.1 与 0.2 之间
  230. valuesMap[dim] = values;
  231. }
  232. return valuesMap;
  233. },
  234. adjustData: function adjustData(dataArray, mergeData) {
  235. var self = this;
  236. var valuesMap = self._getDimValues(mergeData);
  237. each(dataArray, function (data, index) {
  238. // 遍历所有数据集合
  239. each(valuesMap, function (values, dim) {
  240. // 根据不同的度量分别调整位置
  241. self.adjustDim(dim, values, data, dataArray.length, index);
  242. });
  243. });
  244. },
  245. getAdjustRange: function getAdjustRange(dim, key, values) {
  246. var self = this;
  247. var index = values.indexOf(key);
  248. var length = values.length;
  249. var pre;
  250. var next;
  251. if (!self.yField && self.isAdjust('y')) {
  252. pre = 0;
  253. next = 1;
  254. } else if (length > 1) {
  255. pre = index === 0 ? values[0] : values[index - 1];
  256. next = index === length - 1 ? values[length - 1] : values[index + 1];
  257. if (index !== 0) {
  258. pre += (key - pre) / 2;
  259. } else {
  260. pre -= (next - key) / 2;
  261. }
  262. if (index !== length - 1) {
  263. next -= (next - key) / 2;
  264. } else {
  265. next += (key - values[length - 2]) / 2;
  266. }
  267. } else {
  268. pre = key === 0 ? 0 : key - 0.5;
  269. next = key === 0 ? 1 : key + 0.5;
  270. }
  271. return {
  272. pre: pre,
  273. next: next
  274. };
  275. },
  276. /**
  277. * 对数据进行分组
  278. * @param {Array} data 数据
  279. * @param {String} dim 分组的字段
  280. * @return {Object} 分组的键值对映射
  281. */
  282. groupData: function groupData(data, dim) {
  283. var groups = {};
  284. each(data, function (record) {
  285. var value = record[dim];
  286. if (value === undefined) {
  287. value = record[dim] = DEFAULT_Y;
  288. }
  289. if (!groups[value]) {
  290. groups[value] = [];
  291. }
  292. groups[value].push(record);
  293. });
  294. return groups;
  295. }
  296. };
  297. /***/ }),
  298. /* 8 */
  299. /***/ (function(module, exports, __webpack_require__) {
  300. var isNil = __webpack_require__(6);
  301. var isArray = __webpack_require__(1);
  302. var each = __webpack_require__(0);
  303. module.exports = function valuesOfKey(data, name) {
  304. var rst = [];
  305. var tmpMap = {};
  306. for (var i = 0; i < data.length; i++) {
  307. var obj = data[i];
  308. var value = obj[name];
  309. if (!isNil(value)) {
  310. if (!isArray(value)) {
  311. value = [value];
  312. }
  313. each(value, function (val) {
  314. if (!tmpMap[val]) {
  315. rst.push(val);
  316. tmpMap[val] = true;
  317. }
  318. });
  319. }
  320. }
  321. return rst;
  322. };
  323. /***/ }),
  324. /* 9 */
  325. /***/ (function(module, exports, __webpack_require__) {
  326. /**
  327. * 是否为函数
  328. * @param {*} fn 对象
  329. * @return {Boolean} 是否函数
  330. */
  331. var isType = __webpack_require__(5);
  332. var isFunction = function isFunction(value) {
  333. return isType(value, 'Function');
  334. };
  335. module.exports = isFunction;
  336. /***/ }),
  337. /* 10 */
  338. /***/ (function(module, exports, __webpack_require__) {
  339. // 完整版下使用支持按照某个字段进行分组的 dodge
  340. var mix = __webpack_require__(3);
  341. var Adjust = __webpack_require__(2);
  342. var Dodge = __webpack_require__(11);
  343. var Stack = __webpack_require__(13);
  344. var AdjustMixin = __webpack_require__(7);
  345. var DodgeMixin = __webpack_require__(14);
  346. var StackMixin = __webpack_require__(18);
  347. mix(Adjust.prototype, AdjustMixin);
  348. mix(Dodge.prototype, AdjustMixin, DodgeMixin);
  349. mix(Stack.prototype, StackMixin);
  350. Adjust.Jitter = __webpack_require__(19);
  351. Adjust.Symmetric = __webpack_require__(20);
  352. Adjust.Dodge = Dodge;
  353. Adjust.Stack = Stack;
  354. module.exports = Adjust;
  355. /***/ }),
  356. /* 11 */
  357. /***/ (function(module, exports, __webpack_require__) {
  358. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  359. var Adjust = __webpack_require__(2);
  360. var each = __webpack_require__(0);
  361. var MARGIN_RATIO = 1 / 2;
  362. var DODGE_RATIO = 1 / 2;
  363. var Dodge =
  364. /*#__PURE__*/
  365. function (_Adjust) {
  366. _inheritsLoose(Dodge, _Adjust);
  367. function Dodge() {
  368. return _Adjust.apply(this, arguments) || this;
  369. }
  370. var _proto = Dodge.prototype;
  371. _proto._initDefaultCfg = function _initDefaultCfg() {
  372. /**
  373. * 调整过程中,2个数据的间距
  374. * @type {Number}
  375. */
  376. this.marginRatio = MARGIN_RATIO;
  377. /**
  378. * 调整占单位宽度的比例,例如:占2个分类间距的 1/2
  379. * @type {Number}
  380. */
  381. this.dodgeRatio = DODGE_RATIO;
  382. this.adjustNames = ['x', 'y']; // 调整的维度,默认,x,y都做调整
  383. };
  384. _proto.getDodgeOffset = function getDodgeOffset(range, index, count) {
  385. var self = this;
  386. var pre = range.pre;
  387. var next = range.next;
  388. var tickLength = next - pre;
  389. var width = tickLength * self.dodgeRatio / count;
  390. var margin = self.marginRatio * width;
  391. var offset = 1 / 2 * (tickLength - count * width - (count - 1) * margin) + ((index + 1) * width + index * margin) - 1 / 2 * width - 1 / 2 * tickLength;
  392. return (pre + next) / 2 + offset;
  393. };
  394. _proto.processAdjust = function processAdjust(dataArray) {
  395. var self = this;
  396. var count = dataArray.length;
  397. var xField = self.xField;
  398. each(dataArray, function (data, index) {
  399. for (var i = 0, len = data.length; i < len; i++) {
  400. var obj = data[i];
  401. var value = obj[xField];
  402. var range = {
  403. pre: len === 1 ? value - 1 : value - 0.5,
  404. next: len === 1 ? value + 1 : value + 0.5
  405. };
  406. var dodgeValue = self.getDodgeOffset(range, index, count);
  407. obj[xField] = dodgeValue;
  408. }
  409. });
  410. };
  411. return Dodge;
  412. }(Adjust);
  413. Adjust.Dodge = Dodge;
  414. module.exports = Dodge;
  415. /***/ }),
  416. /* 12 */
  417. /***/ (function(module, exports) {
  418. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
  419. return typeof obj;
  420. } : function (obj) {
  421. return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
  422. };
  423. var isObject = function isObject(value) {
  424. /**
  425. * isObject({}) => true
  426. * isObject([1, 2, 3]) => true
  427. * isObject(Function) => true
  428. * isObject(null) => false
  429. */
  430. var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);
  431. return value !== null && type === 'object' || type === 'function';
  432. };
  433. module.exports = isObject;
  434. /***/ }),
  435. /* 13 */
  436. /***/ (function(module, exports, __webpack_require__) {
  437. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  438. var isArray = __webpack_require__(1);
  439. var isNil = __webpack_require__(6);
  440. var Adjust = __webpack_require__(2);
  441. var Stack =
  442. /*#__PURE__*/
  443. function (_Adjust) {
  444. _inheritsLoose(Stack, _Adjust);
  445. function Stack() {
  446. return _Adjust.apply(this, arguments) || this;
  447. }
  448. var _proto = Stack.prototype;
  449. _proto._initDefaultCfg = function _initDefaultCfg() {
  450. this.xField = null; // 调整对应的 x 方向对应的字段名称
  451. this.yField = null; // 调整对应的 y 方向对应的字段名称
  452. };
  453. _proto.processAdjust = function processAdjust(dataArray) {
  454. this.processStack(dataArray);
  455. };
  456. _proto.processStack = function processStack(dataArray) {
  457. var self = this;
  458. var xField = self.xField;
  459. var yField = self.yField;
  460. var count = dataArray.length;
  461. var stackCache = {
  462. positive: {},
  463. negative: {}
  464. }; // 层叠顺序翻转
  465. if (self.reverseOrder) {
  466. dataArray = dataArray.slice(0).reverse();
  467. }
  468. for (var i = 0; i < count; i++) {
  469. var data = dataArray[i];
  470. for (var j = 0, len = data.length; j < len; j++) {
  471. var item = data[j];
  472. var x = item[xField] || 0;
  473. var y = item[yField];
  474. var xkey = x.toString();
  475. y = isArray(y) ? y[1] : y;
  476. if (!isNil(y)) {
  477. var direction = y >= 0 ? 'positive' : 'negative';
  478. if (!stackCache[direction][xkey]) {
  479. stackCache[direction][xkey] = 0;
  480. }
  481. item[yField] = [stackCache[direction][xkey], y + stackCache[direction][xkey]];
  482. stackCache[direction][xkey] += y;
  483. }
  484. }
  485. }
  486. };
  487. return Stack;
  488. }(Adjust);
  489. Adjust.Stack = Stack;
  490. module.exports = Stack;
  491. /***/ }),
  492. /* 14 */
  493. /***/ (function(module, exports, __webpack_require__) {
  494. var ArrayUtil = {
  495. merge: __webpack_require__(4),
  496. values: __webpack_require__(8)
  497. };
  498. var group = __webpack_require__(15);
  499. var each = __webpack_require__(0);
  500. module.exports = {
  501. /**
  502. * @protected
  503. * @override
  504. */
  505. processAdjust: function processAdjust(dataArray) {
  506. var self = this;
  507. var mergeData = ArrayUtil.merge(dataArray);
  508. var dodgeDim = self.dodgeBy;
  509. var adjDataArray = dataArray;
  510. if (dodgeDim) {
  511. // 如果指定了分组dim的字段
  512. adjDataArray = group(mergeData, dodgeDim);
  513. }
  514. self.cacheMap = {};
  515. self.adjDataArray = adjDataArray;
  516. self.mergeData = mergeData;
  517. self.adjustData(adjDataArray, mergeData);
  518. self.adjDataArray = null;
  519. self.mergeData = null;
  520. },
  521. getDistribution: function getDistribution(dim) {
  522. var self = this;
  523. var dataArray = self.adjDataArray;
  524. var cacheMap = self.cacheMap;
  525. var map = cacheMap[dim];
  526. if (!map) {
  527. map = {};
  528. each(dataArray, function (data, index) {
  529. var values = ArrayUtil.values(data, dim);
  530. if (!values.length) {
  531. values.push(0);
  532. }
  533. each(values, function (val) {
  534. if (!map[val]) {
  535. map[val] = [];
  536. }
  537. map[val].push(index);
  538. });
  539. });
  540. cacheMap[dim] = map;
  541. }
  542. return map;
  543. },
  544. adjustDim: function adjustDim(dim, values, data, frameCount, frameIndex) {
  545. var self = this;
  546. var map = self.getDistribution(dim);
  547. var groupData = self.groupData(data, dim); // 根据值分组
  548. each(groupData, function (group, key) {
  549. key = parseFloat(key);
  550. var range;
  551. if (values.length === 1) {
  552. range = {
  553. pre: values[0] - 1,
  554. next: values[0] + 1
  555. };
  556. } else {
  557. range = self.getAdjustRange(dim, key, values);
  558. }
  559. each(group, function (record) {
  560. var value = record[dim];
  561. var valueArr = map[value];
  562. var valIndex = valueArr.indexOf(frameIndex);
  563. record[dim] = self.getDodgeOffset(range, valIndex, valueArr.length);
  564. });
  565. });
  566. }
  567. };
  568. /***/ }),
  569. /* 15 */
  570. /***/ (function(module, exports, __webpack_require__) {
  571. var groupToMap = __webpack_require__(16);
  572. var group = function group(data, condition) {
  573. if (!condition) {
  574. return [data];
  575. }
  576. var groups = groupToMap(data, condition);
  577. var array = [];
  578. for (var i in groups) {
  579. array.push(groups[i]);
  580. }
  581. return array;
  582. };
  583. module.exports = group;
  584. /***/ }),
  585. /* 16 */
  586. /***/ (function(module, exports, __webpack_require__) {
  587. var isFunction = __webpack_require__(9);
  588. var isArray = __webpack_require__(1);
  589. var groupBy = __webpack_require__(17);
  590. var groupToMap = function groupToMap(data, condition) {
  591. if (!condition) {
  592. return {
  593. 0: data
  594. };
  595. }
  596. if (!isFunction(condition)) {
  597. var paramsCondition = isArray(condition) ? condition : condition.replace(/\s+/g, '').split('*');
  598. condition = function condition(row) {
  599. var unique = '_'; // 避免出现数字作为Key的情况,会进行按照数字的排序
  600. for (var i = 0, l = paramsCondition.length; i < l; i++) {
  601. unique += row[paramsCondition[i]] && row[paramsCondition[i]].toString();
  602. }
  603. return unique;
  604. };
  605. }
  606. var groups = groupBy(data, condition);
  607. return groups;
  608. };
  609. module.exports = groupToMap;
  610. /***/ }),
  611. /* 17 */
  612. /***/ (function(module, exports, __webpack_require__) {
  613. var each = __webpack_require__(0);
  614. var isArray = __webpack_require__(1);
  615. var hasOwnProperty = Object.prototype.hasOwnProperty;
  616. var groupBy = function groupBy(data, condition) {
  617. if (!condition || !isArray(data)) {
  618. return data;
  619. }
  620. var result = {};
  621. var key = null;
  622. each(data, function (item) {
  623. key = condition(item);
  624. if (hasOwnProperty.call(result, key)) {
  625. result[key].push(item);
  626. } else {
  627. result[key] = [item];
  628. }
  629. });
  630. return result;
  631. };
  632. module.exports = groupBy;
  633. /***/ }),
  634. /* 18 */
  635. /***/ (function(module, exports) {
  636. module.exports = {
  637. _initDefaultCfg: function _initDefaultCfg() {
  638. this.xField = null; // 调整对应的 x 方向对应的字段名称
  639. this.yField = null; // 调整对应的 y 方向对应的字段名称
  640. this.height = null; // 仅有一个维度调整时,总的高度
  641. this.size = 10; // 单个点的大小
  642. this.reverseOrder = false; // 是否反序进行层叠
  643. this.adjustNames = ['y']; // Only support stack y
  644. },
  645. processOneDimStack: function processOneDimStack(dataArray) {
  646. var self = this;
  647. var xField = self.xField;
  648. var yField = self.yField || 'y';
  649. var height = self.height;
  650. var stackY = {}; // 如果层叠的顺序翻转
  651. if (self.reverseOrder) {
  652. dataArray = dataArray.slice(0).reverse();
  653. }
  654. for (var i = 0, len = dataArray.length; i < len; i++) {
  655. var data = dataArray[i]; // cates
  656. for (var j = 0, dataLen = data.length; j < dataLen; j++) {
  657. var item = data[j];
  658. var size = item.size || self.size;
  659. var stackHeight = size * 2 / height;
  660. var x = item[xField];
  661. if (!stackY[x]) {
  662. stackY[x] = stackHeight / 2;
  663. }
  664. item[yField] = stackY[x];
  665. stackY[x] += stackHeight;
  666. }
  667. }
  668. },
  669. processAdjust: function processAdjust(dataArray) {
  670. if (this.yField) {
  671. this.processStack(dataArray);
  672. } else {
  673. this.processOneDimStack(dataArray);
  674. }
  675. }
  676. };
  677. /***/ }),
  678. /* 19 */
  679. /***/ (function(module, exports, __webpack_require__) {
  680. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  681. var each = __webpack_require__(0);
  682. var mix = __webpack_require__(3);
  683. var ArrayUtil = {
  684. merge: __webpack_require__(4)
  685. };
  686. var Adjust = __webpack_require__(2);
  687. var AdjustMixin = __webpack_require__(7);
  688. var Jitter =
  689. /*#__PURE__*/
  690. function (_Adjust) {
  691. _inheritsLoose(Jitter, _Adjust);
  692. function Jitter() {
  693. return _Adjust.apply(this, arguments) || this;
  694. }
  695. var _proto = Jitter.prototype;
  696. _proto._initDefaultCfg = function _initDefaultCfg() {
  697. this.xField = null; // 调整对应的 x 方向对应的字段名称
  698. this.yField = null; // 调整对应的 y 方向对应的字段名称
  699. this.adjustNames = ['x', 'y']; // 指x,y
  700. this.groupFields = null; // 参与分组的数据维度
  701. };
  702. _proto.processAdjust = function processAdjust(dataArray) {
  703. var self = this;
  704. var mergeData = ArrayUtil.merge(dataArray);
  705. self.adjDataArray = dataArray;
  706. self.mergeData = mergeData;
  707. self.adjustData(dataArray, mergeData);
  708. self.adjFrames = null;
  709. self.mergeData = null;
  710. };
  711. _proto.getAdjustOffset = function getAdjustOffset(pre, next) {
  712. var r = Math.random(); // 随机位置,均匀分布
  713. var avg = next - pre; // * length
  714. var append = avg * 0.05;
  715. return pre + append + avg * 0.9 * r;
  716. }; // adjust group data
  717. _proto._adjustGroup = function _adjustGroup(group, dim, key, values) {
  718. var self = this;
  719. var range = self.getAdjustRange(dim, key, values);
  720. each(group, function (record) {
  721. record[dim] = self.getAdjustOffset(range.pre, range.next); // 获取调整的位置
  722. });
  723. };
  724. _proto.adjustDim = function adjustDim(dim, values, data) {
  725. var self = this;
  726. var groupData = self.groupData(data, dim);
  727. each(groupData, function (group, key) {
  728. key = parseFloat(key);
  729. self._adjustGroup(group, dim, key, values);
  730. });
  731. };
  732. return Jitter;
  733. }(Adjust);
  734. mix(Jitter.prototype, AdjustMixin);
  735. Adjust.Jitter = Jitter;
  736. module.exports = Jitter;
  737. /***/ }),
  738. /* 20 */
  739. /***/ (function(module, exports, __webpack_require__) {
  740. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  741. var each = __webpack_require__(0);
  742. var maxBy = __webpack_require__(21);
  743. var isArray = __webpack_require__(1);
  744. var ArrayUtil = {
  745. merge: __webpack_require__(4)
  746. };
  747. var Adjust = __webpack_require__(2);
  748. var Symmetric =
  749. /*#__PURE__*/
  750. function (_Adjust) {
  751. _inheritsLoose(Symmetric, _Adjust);
  752. function Symmetric() {
  753. return _Adjust.apply(this, arguments) || this;
  754. }
  755. var _proto = Symmetric.prototype;
  756. _proto._initDefaultCfg = function _initDefaultCfg() {
  757. this.xField = null; // 调整对应的 x 方向对应的字段名称
  758. this.yField = null; // 调整对应的 y 方向对应的字段名称
  759. this.cacheMax = null; // 缓存的最大值
  760. this.adjustNames = ['y']; // Only support stack y
  761. this.groupFields = null; // 参与分组的数据维度
  762. }; // 获取最大的y值
  763. _proto._getMax = function _getMax(dim) {
  764. var self = this;
  765. var mergeData = self.mergeData;
  766. var maxRecord = maxBy(mergeData, function (obj) {
  767. var value = obj[dim];
  768. if (isArray(value)) {
  769. return Math.max.apply(null, value);
  770. }
  771. return value;
  772. });
  773. var maxValue = maxRecord[dim];
  774. var max = isArray(maxValue) ? Math.max.apply(null, maxValue) : maxValue;
  775. return max;
  776. }; // 获取每个字段最大的值
  777. _proto._getXValuesMax = function _getXValuesMax() {
  778. var self = this;
  779. var yField = self.yField;
  780. var xField = self.xField;
  781. var cache = {};
  782. var mergeData = self.mergeData;
  783. each(mergeData, function (obj) {
  784. var xValue = obj[xField];
  785. var yValue = obj[yField];
  786. var max = isArray(yValue) ? Math.max.apply(null, yValue) : yValue;
  787. cache[xValue] = cache[xValue] || 0;
  788. if (cache[xValue] < max) {
  789. cache[xValue] = max;
  790. }
  791. });
  792. return cache;
  793. }; // 入口函数
  794. _proto.processAdjust = function processAdjust(dataArray) {
  795. var self = this;
  796. var mergeData = ArrayUtil.merge(dataArray);
  797. self.mergeData = mergeData;
  798. self._processSymmetric(dataArray);
  799. self.mergeData = null;
  800. }; // 处理对称
  801. _proto._processSymmetric = function _processSymmetric(dataArray) {
  802. var self = this;
  803. var xField = self.xField;
  804. var yField = self.yField;
  805. var max = self._getMax(yField);
  806. var first = dataArray[0][0];
  807. var cache;
  808. if (first && isArray(first[yField])) {
  809. cache = self._getXValuesMax();
  810. }
  811. each(dataArray, function (data) {
  812. each(data, function (obj) {
  813. var value = obj[yField];
  814. var offset;
  815. if (isArray(value)) {
  816. var xValue = obj[xField];
  817. var valueMax = cache[xValue];
  818. offset = (max - valueMax) / 2;
  819. var tmp = [];
  820. /* eslint-disable no-loop-func */
  821. each(value, function (subVal) {
  822. // 多个字段
  823. tmp.push(offset + subVal);
  824. });
  825. /* eslint-enable no-loop-func */
  826. obj[yField] = tmp;
  827. } else {
  828. offset = (max - value) / 2;
  829. obj[yField] = [offset, value + offset];
  830. }
  831. });
  832. });
  833. };
  834. return Symmetric;
  835. }(Adjust);
  836. Adjust.Symmetric = Symmetric;
  837. module.exports = Symmetric;
  838. /***/ }),
  839. /* 21 */
  840. /***/ (function(module, exports, __webpack_require__) {
  841. var isArray = __webpack_require__(1);
  842. var isFunction = __webpack_require__(9);
  843. var each = __webpack_require__(0);
  844. /**
  845. * @param {Array} arr The array to iterate over.
  846. * @param {Function} [fn] The iteratee invoked per element.
  847. * @return {*} Returns the maximum value.
  848. * @example
  849. *
  850. * var objects = [{ 'n': 1 }, { 'n': 2 }];
  851. *
  852. * maxBy(objects, function(o) { return o.n; });
  853. * // => { 'n': 2 }
  854. *
  855. * maxBy(objects, 'n');
  856. * // => { 'n': 2 }
  857. */
  858. var maxBy = function maxBy(arr, fn) {
  859. if (!isArray(arr)) {
  860. return undefined;
  861. }
  862. var max = arr[0];
  863. var maxData = void 0;
  864. if (isFunction(fn)) {
  865. maxData = fn(arr[0]);
  866. } else {
  867. maxData = arr[0][fn];
  868. }
  869. var data = void 0;
  870. each(arr, function (val) {
  871. if (isFunction(fn)) {
  872. data = fn(val);
  873. } else {
  874. data = val[fn];
  875. }
  876. if (data > maxData) {
  877. max = val;
  878. maxData = data;
  879. }
  880. });
  881. return max;
  882. };
  883. module.exports = maxBy;
  884. /***/ })
  885. /******/ ]);
  886. });
  887. //# sourceMappingURL=adjust.js.map