Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

102 строки
2.6 KiB

  1. import {range as sequence} from "d3-array";
  2. import ordinal from "./ordinal";
  3. export default function band() {
  4. var scale = ordinal().unknown(undefined),
  5. domain = scale.domain,
  6. ordinalRange = scale.range,
  7. range = [0, 1],
  8. step,
  9. bandwidth,
  10. round = false,
  11. paddingInner = 0,
  12. paddingOuter = 0,
  13. align = 0.5;
  14. delete scale.unknown;
  15. function rescale() {
  16. var n = domain().length,
  17. reverse = range[1] < range[0],
  18. start = range[reverse - 0],
  19. stop = range[1 - reverse];
  20. step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
  21. if (round) step = Math.floor(step);
  22. start += (stop - start - step * (n - paddingInner)) * align;
  23. bandwidth = step * (1 - paddingInner);
  24. if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
  25. var values = sequence(n).map(function(i) { return start + step * i; });
  26. return ordinalRange(reverse ? values.reverse() : values);
  27. }
  28. scale.domain = function(_) {
  29. return arguments.length ? (domain(_), rescale()) : domain();
  30. };
  31. scale.range = function(_) {
  32. return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();
  33. };
  34. scale.rangeRound = function(_) {
  35. return range = [+_[0], +_[1]], round = true, rescale();
  36. };
  37. scale.bandwidth = function() {
  38. return bandwidth;
  39. };
  40. scale.step = function() {
  41. return step;
  42. };
  43. scale.round = function(_) {
  44. return arguments.length ? (round = !!_, rescale()) : round;
  45. };
  46. scale.padding = function(_) {
  47. return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
  48. };
  49. scale.paddingInner = function(_) {
  50. return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
  51. };
  52. scale.paddingOuter = function(_) {
  53. return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
  54. };
  55. scale.align = function(_) {
  56. return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
  57. };
  58. scale.copy = function() {
  59. return band()
  60. .domain(domain())
  61. .range(range)
  62. .round(round)
  63. .paddingInner(paddingInner)
  64. .paddingOuter(paddingOuter)
  65. .align(align);
  66. };
  67. return rescale();
  68. }
  69. function pointish(scale) {
  70. var copy = scale.copy;
  71. scale.padding = scale.paddingOuter;
  72. delete scale.paddingInner;
  73. delete scale.paddingOuter;
  74. scale.copy = function() {
  75. return pointish(copy());
  76. };
  77. return scale;
  78. }
  79. export function point() {
  80. return pointish(band().paddingInner(1));
  81. }