pretty.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { prettyNumber } from './pretty-number';
  2. export default function pretty(min, max, m) {
  3. if (m === void 0) { m = 5; }
  4. if (min === max) {
  5. return {
  6. max: max,
  7. min: min,
  8. ticks: [min],
  9. };
  10. }
  11. var n = m < 0 ? 0 : Math.round(m);
  12. if (n === 0)
  13. return { max: max, min: min, ticks: [] };
  14. /*
  15. R pretty:
  16. https://svn.r-project.org/R/trunk/src/appl/pretty.c
  17. https://www.rdocumentation.org/packages/base/versions/3.5.2/topics/pretty
  18. */
  19. var h = 1.5; // high.u.bias
  20. var h5 = 0.5 + 1.5 * h; // u5.bias
  21. // 反正我也不会调参,跳过所有判断步骤
  22. var d = max - min;
  23. var c = d / n;
  24. // 当d非常小的时候触发,但似乎没什么用
  25. // const min_n = Math.floor(n / 3);
  26. // const shrink_sml = Math.pow(2, 5);
  27. // if (Math.log10(d) < -2) {
  28. // c = (_.max([ Math.abs(max), Math.abs(min) ]) * shrink_sml) / min_n;
  29. // }
  30. var base = Math.pow(10, Math.floor(Math.log10(c)));
  31. var unit = base;
  32. if (2 * base - c < h * (c - unit)) {
  33. unit = 2 * base;
  34. if (5 * base - c < h5 * (c - unit)) {
  35. unit = 5 * base;
  36. if (10 * base - c < h * (c - unit)) {
  37. unit = 10 * base;
  38. }
  39. }
  40. }
  41. var nu = Math.ceil(max / unit);
  42. var ns = Math.floor(min / unit);
  43. var hi = Math.max(nu * unit, max);
  44. var lo = Math.min(ns * unit, min);
  45. var size = Math.floor((hi - lo) / unit) + 1;
  46. var ticks = new Array(size);
  47. for (var i = 0; i < size; i++) {
  48. ticks[i] = prettyNumber(lo + i * unit);
  49. }
  50. return {
  51. min: lo,
  52. max: hi,
  53. ticks: ticks,
  54. };
  55. }
  56. //# sourceMappingURL=pretty.js.map