adjust.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. var DEFAULT_Y = 0; // 默认的y的值
  2. var each = require('@antv/util/lib/each');
  3. var ArrayUtil = {
  4. values: require('@antv/util/lib/array/values-of-key')
  5. };
  6. module.exports = {
  7. /**
  8. * 对应的维度是否可以调整
  9. * @protected
  10. * @param {String} dimName 可以调整的维度 x,y
  11. * @return {Boolean} 是否可以调整
  12. */
  13. isAdjust: function isAdjust(dimName) {
  14. return this.adjustNames.indexOf(dimName) >= 0;
  15. },
  16. /**
  17. * @protected
  18. * 获取可调整度量对应的值
  19. * @param {Frame} mergeData 数据
  20. * @return {Object} 值的映射
  21. */
  22. _getDimValues: function _getDimValues(mergeData) {
  23. var self = this;
  24. var valuesMap = {};
  25. var dims = [];
  26. if (self.xField && self.isAdjust('x')) {
  27. dims.push(self.xField);
  28. }
  29. if (self.yField && self.isAdjust('y')) {
  30. dims.push(self.yField);
  31. }
  32. each(dims, function (dim) {
  33. var values = ArrayUtil.values(mergeData, dim);
  34. values.sort(function (v1, v2) {
  35. return v1 - v2;
  36. });
  37. valuesMap[dim] = values;
  38. });
  39. if (!self.yField && self.isAdjust('y')) {
  40. // 只有一维的情况下,同时调整y
  41. var dim = 'y';
  42. var values = [DEFAULT_Y, 1]; // 默认分布在y轴的 0.1 与 0.2 之间
  43. valuesMap[dim] = values;
  44. }
  45. return valuesMap;
  46. },
  47. adjustData: function adjustData(dataArray, mergeData) {
  48. var self = this;
  49. var valuesMap = self._getDimValues(mergeData);
  50. each(dataArray, function (data, index) {
  51. // 遍历所有数据集合
  52. each(valuesMap, function (values, dim) {
  53. // 根据不同的度量分别调整位置
  54. self.adjustDim(dim, values, data, dataArray.length, index);
  55. });
  56. });
  57. },
  58. getAdjustRange: function getAdjustRange(dim, key, values) {
  59. var self = this;
  60. var index = values.indexOf(key);
  61. var length = values.length;
  62. var pre;
  63. var next;
  64. if (!self.yField && self.isAdjust('y')) {
  65. pre = 0;
  66. next = 1;
  67. } else if (length > 1) {
  68. pre = index === 0 ? values[0] : values[index - 1];
  69. next = index === length - 1 ? values[length - 1] : values[index + 1];
  70. if (index !== 0) {
  71. pre += (key - pre) / 2;
  72. } else {
  73. pre -= (next - key) / 2;
  74. }
  75. if (index !== length - 1) {
  76. next -= (next - key) / 2;
  77. } else {
  78. next += (key - values[length - 2]) / 2;
  79. }
  80. } else {
  81. pre = key === 0 ? 0 : key - 0.5;
  82. next = key === 0 ? 1 : key + 0.5;
  83. }
  84. return {
  85. pre: pre,
  86. next: next
  87. };
  88. },
  89. /**
  90. * 对数据进行分组
  91. * @param {Array} data 数据
  92. * @param {String} dim 分组的字段
  93. * @return {Object} 分组的键值对映射
  94. */
  95. groupData: function groupData(data, dim) {
  96. var groups = {};
  97. each(data, function (record) {
  98. var value = record[dim];
  99. if (value === undefined) {
  100. value = record[dim] = DEFAULT_Y;
  101. }
  102. if (!groups[value]) {
  103. groups[value] = [];
  104. }
  105. groups[value].push(record);
  106. });
  107. return groups;
  108. }
  109. };