quantile.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. /**
  4. * 计算几分位 https://github.com/simple-statistics/simple-statistics/blob/master/src/quantile_sorted.js
  5. * @param x 数组
  6. * @param p 百分比
  7. */
  8. function quantileSorted(x, p) {
  9. var idx = x.length * p;
  10. /*if (x.length === 0) { // 当前场景这些条件不可能命中
  11. throw new Error('quantile requires at least one value.');
  12. } else if (p < 0 || p > 1) {
  13. throw new Error('quantiles must be between 0 and 1');
  14. } else */
  15. if (p === 1) {
  16. // If p is 1, directly return the last element
  17. return x[x.length - 1];
  18. }
  19. else if (p === 0) {
  20. // If p is 0, directly return the first element
  21. return x[0];
  22. }
  23. else if (idx % 1 !== 0) {
  24. // If p is not integer, return the next element in array
  25. return x[Math.ceil(idx) - 1];
  26. }
  27. else if (x.length % 2 === 0) {
  28. // If the list has even-length, we'll take the average of this number
  29. // and the next value, if there is one
  30. return (x[idx - 1] + x[idx]) / 2;
  31. }
  32. else {
  33. // Finally, in the simple case of an integer value
  34. // with an odd-length list, return the x value at the index.
  35. return x[idx];
  36. }
  37. }
  38. function calculateTicks(cfg) {
  39. var tickCount = cfg.tickCount, values = cfg.values;
  40. if (!values || !values.length) {
  41. return [];
  42. }
  43. var sorted = values.slice().sort(function (a, b) {
  44. return a - b;
  45. });
  46. var ticks = [];
  47. for (var i = 0; i < tickCount; i++) {
  48. var p = i / (tickCount - 1);
  49. ticks.push(quantileSorted(sorted, p));
  50. }
  51. return ticks;
  52. }
  53. exports.default = calculateTicks;
  54. //# sourceMappingURL=quantile.js.map