histogram.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.binHistogram = void 0;
  4. var util_1 = require("@antv/util");
  5. // 进行转换得到值所在的 range
  6. function getBinKey(value, binWidth, binNumber) {
  7. // 做一点特殊处理
  8. if (binNumber === 1) {
  9. return [0, binWidth];
  10. }
  11. var index = Math.floor(value / binWidth);
  12. return [binWidth * index, binWidth * (index + 1)];
  13. }
  14. // 默认 sturges 转换
  15. function sturges(values) {
  16. return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
  17. }
  18. /**
  19. * 对数据进行百分比化
  20. * @param data
  21. * @param binField
  22. * @param binWidth
  23. * @param binNumber
  24. * @param stackField
  25. */
  26. function binHistogram(data, binField, binWidth, binNumber, stackField) {
  27. var originData_copy = (0, util_1.clone)(data);
  28. // 根据 binField 对源数据进行排序
  29. (0, util_1.sortBy)(originData_copy, binField);
  30. // 获取源数据 binField 的 range
  31. var values = (0, util_1.valuesOfKey)(originData_copy, binField);
  32. var range = (0, util_1.getRange)(values);
  33. var rangeWidth = range.max - range.min;
  34. // 计算分箱,直方图分箱的计算基于 binWidth,如配置了 binNumber 则将其转为 binWidth 进行计算
  35. var _binWidth = binWidth;
  36. if (!binWidth && binNumber) {
  37. _binWidth = binNumber > 1 ? rangeWidth / (binNumber - 1) : range.max;
  38. }
  39. // 当 binWidth 和 binNumber 都没有指定的情况,采用 Sturges formula 自动生成 binWidth
  40. if (!binWidth && !binNumber) {
  41. var _defaultBinNumber = sturges(values);
  42. _binWidth = rangeWidth / _defaultBinNumber;
  43. }
  44. // 构建 key - StatisticData 结构
  45. var bins = {};
  46. var groups = (0, util_1.groupBy)(originData_copy, stackField);
  47. // 判断分组是否为空,如果为空,说明没有 stackField 字段
  48. if ((0, util_1.isEmpty)(groups)) {
  49. (0, util_1.each)(originData_copy, function (data) {
  50. var value = data[binField];
  51. var bin = getBinKey(value, _binWidth, binNumber);
  52. var binKey = "".concat(bin[0], "-").concat(bin[1]);
  53. if (!(0, util_1.hasKey)(bins, binKey)) {
  54. bins[binKey] = { range: bin, count: 0 };
  55. }
  56. bins[binKey].count += 1;
  57. });
  58. }
  59. else {
  60. Object.keys(groups).forEach(function (groupKey) {
  61. (0, util_1.each)(groups[groupKey], function (data) {
  62. var value = data[binField];
  63. var bin = getBinKey(value, _binWidth, binNumber);
  64. var binKey = "".concat(bin[0], "-").concat(bin[1]);
  65. var groupKeyBinKey = "".concat(binKey, "-").concat(groupKey);
  66. if (!(0, util_1.hasKey)(bins, groupKeyBinKey)) {
  67. bins[groupKeyBinKey] = { range: bin, count: 0 };
  68. bins[groupKeyBinKey][stackField] = groupKey;
  69. }
  70. bins[groupKeyBinKey].count += 1;
  71. });
  72. });
  73. }
  74. // 将分箱数据转换为 plotData 才是图表所需要的
  75. var plotData = [];
  76. (0, util_1.each)(bins, function (bin) {
  77. plotData.push(bin);
  78. });
  79. return plotData;
  80. }
  81. exports.binHistogram = binHistogram;
  82. //# sourceMappingURL=histogram.js.map