dodge.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var tslib_1 = require("tslib");
  4. var _ = require("@antv/util");
  5. var constant_1 = require("../constant");
  6. var adjust_1 = require("./adjust");
  7. var Dodge = /** @class */ (function (_super) {
  8. tslib_1.__extends(Dodge, _super);
  9. function Dodge(cfg) {
  10. var _this = _super.call(this, cfg) || this;
  11. _this.cacheMap = {};
  12. _this.adjustDataArray = [];
  13. _this.mergeData = [];
  14. 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, dodgeBy = cfg.dodgeBy, intervalPadding = cfg.intervalPadding, dodgePadding = cfg.dodgePadding, xDimensionLength = cfg.xDimensionLength, groupNum = cfg.groupNum, defaultSize = cfg.defaultSize, maxColumnWidth = cfg.maxColumnWidth, minColumnWidth = cfg.minColumnWidth, columnWidthRatio = cfg.columnWidthRatio, customOffset = cfg.customOffset;
  15. _this.marginRatio = marginRatio;
  16. _this.dodgeRatio = dodgeRatio;
  17. _this.dodgeBy = dodgeBy;
  18. _this.intervalPadding = intervalPadding;
  19. _this.dodgePadding = dodgePadding;
  20. _this.xDimensionLegenth = xDimensionLength;
  21. _this.groupNum = groupNum;
  22. _this.defaultSize = defaultSize;
  23. _this.maxColumnWidth = maxColumnWidth;
  24. _this.minColumnWidth = minColumnWidth;
  25. _this.columnWidthRatio = columnWidthRatio;
  26. _this.customOffset = customOffset;
  27. return _this;
  28. }
  29. Dodge.prototype.process = function (groupDataArray) {
  30. var groupedDataArray = _.clone(groupDataArray);
  31. // 将数据数组展开一层
  32. var mergeData = _.flatten(groupedDataArray);
  33. var dodgeBy = this.dodgeBy;
  34. // 如果指定了分组 dim 的字段
  35. var adjustDataArray = dodgeBy ? _.group(mergeData, dodgeBy) : groupedDataArray;
  36. this.cacheMap = {};
  37. this.adjustDataArray = adjustDataArray;
  38. this.mergeData = mergeData;
  39. this.adjustData(adjustDataArray, mergeData);
  40. this.adjustDataArray = [];
  41. this.mergeData = [];
  42. return groupedDataArray;
  43. };
  44. Dodge.prototype.adjustDim = function (dim, values, data, frameIndex) {
  45. var _this = this;
  46. var customOffset = this.customOffset;
  47. var map = this.getDistribution(dim);
  48. var groupData = this.groupData(data, dim); // 根据值分组
  49. _.each(groupData, function (group, key) {
  50. var range;
  51. // xField 中只有一个值,不需要做 dodge
  52. if (values.length === 1) {
  53. range = {
  54. pre: values[0] - 1,
  55. next: values[0] + 1,
  56. };
  57. }
  58. else {
  59. // 如果有多个,则需要获取调整的范围
  60. range = _this.getAdjustRange(dim, parseFloat(key), values);
  61. }
  62. _.each(group, function (d) {
  63. var value = d[dim];
  64. var valueArr = map[value];
  65. var valIndex = valueArr.indexOf(frameIndex);
  66. if (!_.isNil(customOffset)) {
  67. var pre = range.pre, next = range.next;
  68. d[dim] = _.isFunction(customOffset) ? customOffset(d, range) : (pre + next) / 2 + customOffset;
  69. }
  70. else {
  71. d[dim] = _this.getDodgeOffset(range, valIndex, valueArr.length);
  72. }
  73. });
  74. });
  75. return [];
  76. };
  77. Dodge.prototype.getDodgeOffset = function (range, idx, len) {
  78. var _a = this, dodgeRatio = _a.dodgeRatio, marginRatio = _a.marginRatio, intervalPadding = _a.intervalPadding, dodgePadding = _a.dodgePadding;
  79. var pre = range.pre, next = range.next;
  80. var tickLength = next - pre;
  81. var position;
  82. // 分多种输入情况
  83. if (!_.isNil(intervalPadding) && _.isNil(dodgePadding) && intervalPadding >= 0) {
  84. // 仅配置intervalPadding
  85. var offset = this.getIntervalOnlyOffset(len, idx);
  86. position = pre + offset;
  87. }
  88. else if (!_.isNil(dodgePadding) && _.isNil(intervalPadding) && dodgePadding >= 0) {
  89. // 仅配置dodgePadding
  90. var offset = this.getDodgeOnlyOffset(len, idx);
  91. position = pre + offset;
  92. }
  93. else if (!_.isNil(intervalPadding) &&
  94. !_.isNil(dodgePadding) &&
  95. intervalPadding >= 0 &&
  96. dodgePadding >= 0) {
  97. // 同时配置intervalPadding和dodgePadding
  98. var offset = this.getIntervalAndDodgeOffset(len, idx);
  99. position = pre + offset;
  100. }
  101. else {
  102. // 默认情况
  103. var width = (tickLength * dodgeRatio) / len;
  104. var margin = marginRatio * width;
  105. var offset = (1 / 2) * (tickLength - len * width - (len - 1) * margin) +
  106. ((idx + 1) * width + idx * margin) -
  107. (1 / 2) * width -
  108. (1 / 2) * tickLength;
  109. position = (pre + next) / 2 + offset;
  110. }
  111. return position;
  112. };
  113. Dodge.prototype.getIntervalOnlyOffset = function (len, idx) {
  114. var _a = this, defaultSize = _a.defaultSize, intervalPadding = _a.intervalPadding, xDimensionLegenth = _a.xDimensionLegenth, groupNum = _a.groupNum, dodgeRatio = _a.dodgeRatio, maxColumnWidth = _a.maxColumnWidth, minColumnWidth = _a.minColumnWidth, columnWidthRatio = _a.columnWidthRatio;
  115. var normalizedIntervalPadding = intervalPadding / xDimensionLegenth;
  116. var normalizedDodgePadding = (1 - (groupNum - 1) * normalizedIntervalPadding) / groupNum * dodgeRatio / (len - 1);
  117. var geomWidth = ((1 - normalizedIntervalPadding * (groupNum - 1)) / groupNum - normalizedDodgePadding * (len - 1)) / len;
  118. // 根据columnWidthRatio/defaultSize/maxColumnWidth/minColumnWidth调整宽度
  119. geomWidth = (!_.isNil(columnWidthRatio)) ? 1 / groupNum / len * columnWidthRatio : geomWidth;
  120. if (!_.isNil(maxColumnWidth)) {
  121. var normalizedMaxWidht = maxColumnWidth / xDimensionLegenth;
  122. geomWidth = Math.min(geomWidth, normalizedMaxWidht);
  123. }
  124. if (!_.isNil(minColumnWidth)) {
  125. var normalizedMinWidht = minColumnWidth / xDimensionLegenth;
  126. geomWidth = Math.max(geomWidth, normalizedMinWidht);
  127. }
  128. geomWidth = defaultSize ? (defaultSize / xDimensionLegenth) : geomWidth;
  129. // 调整组内间隔
  130. normalizedDodgePadding = ((1 - (groupNum - 1) * normalizedIntervalPadding) / groupNum - len * geomWidth) / (len - 1);
  131. var offset = ((1 / 2 + idx) * geomWidth + idx * normalizedDodgePadding +
  132. (1 / 2) * normalizedIntervalPadding) * groupNum -
  133. normalizedIntervalPadding / 2;
  134. return offset;
  135. };
  136. Dodge.prototype.getDodgeOnlyOffset = function (len, idx) {
  137. var _a = this, defaultSize = _a.defaultSize, dodgePadding = _a.dodgePadding, xDimensionLegenth = _a.xDimensionLegenth, groupNum = _a.groupNum, marginRatio = _a.marginRatio, maxColumnWidth = _a.maxColumnWidth, minColumnWidth = _a.minColumnWidth, columnWidthRatio = _a.columnWidthRatio;
  138. var normalizedDodgePadding = dodgePadding / xDimensionLegenth;
  139. var normalizedIntervalPadding = 1 * marginRatio / (groupNum - 1);
  140. var geomWidth = ((1 - normalizedIntervalPadding * (groupNum - 1)) / groupNum - normalizedDodgePadding * (len - 1)) / len;
  141. // 根据columnWidthRatio/defaultSize/maxColumnWidth/minColumnWidth调整宽度
  142. geomWidth = columnWidthRatio ? 1 / groupNum / len * columnWidthRatio : geomWidth;
  143. if (!_.isNil(maxColumnWidth)) {
  144. var normalizedMaxWidht = maxColumnWidth / xDimensionLegenth;
  145. geomWidth = Math.min(geomWidth, normalizedMaxWidht);
  146. }
  147. if (!_.isNil(minColumnWidth)) {
  148. var normalizedMinWidht = minColumnWidth / xDimensionLegenth;
  149. geomWidth = Math.max(geomWidth, normalizedMinWidht);
  150. }
  151. geomWidth = defaultSize ? (defaultSize / xDimensionLegenth) : geomWidth;
  152. // 调整组间距
  153. normalizedIntervalPadding = (1 - (geomWidth * len + normalizedDodgePadding * (len - 1)) * groupNum) / (groupNum - 1);
  154. var offset = ((1 / 2 + idx) * geomWidth + idx * normalizedDodgePadding +
  155. (1 / 2) * normalizedIntervalPadding) * groupNum -
  156. normalizedIntervalPadding / 2;
  157. return offset;
  158. };
  159. Dodge.prototype.getIntervalAndDodgeOffset = function (len, idx) {
  160. var _a = this, intervalPadding = _a.intervalPadding, dodgePadding = _a.dodgePadding, xDimensionLegenth = _a.xDimensionLegenth, groupNum = _a.groupNum;
  161. var normalizedIntervalPadding = intervalPadding / xDimensionLegenth;
  162. var normalizedDodgePadding = dodgePadding / xDimensionLegenth;
  163. var geomWidth = ((1 - normalizedIntervalPadding * (groupNum - 1)) / groupNum - normalizedDodgePadding * (len - 1)) / len;
  164. var offset = ((1 / 2 + idx) * geomWidth + idx * normalizedDodgePadding +
  165. (1 / 2) * normalizedIntervalPadding) * groupNum -
  166. normalizedIntervalPadding / 2;
  167. return offset;
  168. };
  169. Dodge.prototype.getDistribution = function (dim) {
  170. var groupedDataArray = this.adjustDataArray;
  171. var cacheMap = this.cacheMap;
  172. var map = cacheMap[dim];
  173. if (!map) {
  174. map = {};
  175. _.each(groupedDataArray, function (data, index) {
  176. var values = _.valuesOfKey(data, dim);
  177. if (!values.length) {
  178. values.push(0);
  179. }
  180. _.each(values, function (val) {
  181. if (!map[val]) {
  182. map[val] = [];
  183. }
  184. map[val].push(index);
  185. });
  186. });
  187. cacheMap[dim] = map;
  188. }
  189. return map;
  190. };
  191. return Dodge;
  192. }(adjust_1.default));
  193. exports.default = Dodge;
  194. //# sourceMappingURL=dodge.js.map