dodge.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. var ArrayUtil = {
  2. merge: require('@antv/util/lib/array/merge'),
  3. values: require('@antv/util/lib/array/values-of-key')
  4. };
  5. var group = require('@antv/util/lib/group');
  6. var each = require('@antv/util/lib/each');
  7. module.exports = {
  8. /**
  9. * @protected
  10. * @override
  11. */
  12. processAdjust: function processAdjust(dataArray) {
  13. var self = this;
  14. var mergeData = ArrayUtil.merge(dataArray);
  15. var dodgeDim = self.dodgeBy;
  16. var adjDataArray = dataArray;
  17. if (dodgeDim) {
  18. // 如果指定了分组dim的字段
  19. adjDataArray = group(mergeData, dodgeDim);
  20. }
  21. self.cacheMap = {};
  22. self.adjDataArray = adjDataArray;
  23. self.mergeData = mergeData;
  24. self.adjustData(adjDataArray, mergeData);
  25. self.adjDataArray = null;
  26. self.mergeData = null;
  27. },
  28. getDistribution: function getDistribution(dim) {
  29. var self = this;
  30. var dataArray = self.adjDataArray;
  31. var cacheMap = self.cacheMap;
  32. var map = cacheMap[dim];
  33. if (!map) {
  34. map = {};
  35. each(dataArray, function (data, index) {
  36. var values = ArrayUtil.values(data, dim);
  37. if (!values.length) {
  38. values.push(0);
  39. }
  40. each(values, function (val) {
  41. if (!map[val]) {
  42. map[val] = [];
  43. }
  44. map[val].push(index);
  45. });
  46. });
  47. cacheMap[dim] = map;
  48. }
  49. return map;
  50. },
  51. adjustDim: function adjustDim(dim, values, data, frameCount, frameIndex) {
  52. var self = this;
  53. var map = self.getDistribution(dim);
  54. var groupData = self.groupData(data, dim); // 根据值分组
  55. each(groupData, function (group, key) {
  56. key = parseFloat(key);
  57. var range;
  58. if (values.length === 1) {
  59. range = {
  60. pre: values[0] - 1,
  61. next: values[0] + 1
  62. };
  63. } else {
  64. range = self.getAdjustRange(dim, key, values);
  65. }
  66. each(group, function (record) {
  67. var value = record[dim];
  68. var valueArr = map[value];
  69. var valIndex = valueArr.indexOf(frameIndex);
  70. record[dim] = self.getDodgeOffset(range, valIndex, valueArr.length);
  71. });
  72. });
  73. }
  74. };