线性比例尺,创建一个度量匹配值
https://github.com/xswei/d3-scale/blob/master/README.md

d3.scaleLinear 返回 continuous对象 [kənˈtɪnjuəs] 连续的

返回一个线性比例尺对象

continuous.domain([domain]) 设置定义域

设置定义域, domain必须是数值, 例如 continuous.domain([0, 10])

continuous.range([range]) 设置值域

设置值域range可以是任意值 例如 continuous.range([“red”, “blue”]);
任何支持 interpolator 的类型都可以被设置。但是要注意的是如果要使用 invert 则 range 必须指定为数值类型. 如果 range 没有指定则返回比例尺当前 range 的拷贝。参考 continuous.interpolate 获取更多例子。

continuous.rangeRound([range]) 简写

等价与

  1. continuous
  2. .range(range)
  3. .interpolate(d3.interpolateRound);

d3.interpolateRound(a, b) 插值器

返回一个在两个数值 ab 之间插值的插值器; 这个插值器与 interpolateNumber 类似但是会对返回的结果进行四舍五入。.

continuous.clamp(clamp) 设置不允许超出边界值

在未设置clamp时,则当传入位于 domain 之外的值时会推算出对应的、处于 range 之外的值。

  1. var x = d3.scaleLinear()
  2. .domain([10, 130])
  3. .range([0, 960]);
  4. x(-10); // -160, outside range
  5. x.invert(-160); // -10, outside domain
  6. x.clamp(true);
  7. x(-10); // 0, clamped to range
  8. x.invert(-160); // 10, clamped to domain

continuous.interpolate(interpolate) 指定插值器

如果指定了 interpolate 则设置比例尺的 range 插值器。插值器函数被用来在两个相邻的来自 range 值之间进行插值;这些插值器将输入值 t 归一化到 [0, 1] 之间。如果 factory 没有指定则返回比例尺的当前插值函数。默认为 interpolate. 参考 d3-interpolate 获取更多关于插值器的介绍。
例如,考虑输出范围为三个颜色值:

  1. var color = d3.scaleLinear()
  2. .domain([-100, 0, +100])
  3. .range(["red", "white", "green"]);

内部会创建两个插值器,等价于:

  1. var i0 = d3.interpolate("red", "white"),
  2. i1 = d3.interpolate("white", "green");

自定义插值器的一个直接的原因是可以修改插值器的颜色空间,比如使用 HCL 颜色空间:

  1. var color = d3.scaleLinear()
  2. .domain([10, 100])
  3. .range(["brown", "steelblue"])
  4. .interpolate(d3.interpolateHcl);

或者自定义 Cubehelixgamma 值:

  1. var color = d3.scaleLinear()
  2. .domain([10, 100])
  3. .range(["brown", "steelblue"])
  4. .interpolate(d3.interpolateCubehelix.gamma(3));

注意:default interpolator 可能复用返回值。例如,如果 range 为对象,则 range 插值器总是返回同一个修改后的对象。如果比例尺用来设置样式或者属性,则可以使用这种方式,但是如果你想存储比例尺的返回值,则必须指定自己的插值器或者适当的复制。

continuous.ticks([count]) 刻度尺

返回近似的用来表示比例尺 domaincount。如果没有指定 count 则默认为 10. 返回的 tick 值的个数是均匀的并且对人类友好的(比如都为 10 的整数倍),切在 domain 的范围内。ticks 经常被用来显示刻度线或者刻度标记。指定的 count 仅仅是一个参考,比例尺会根据 domain 计算具体的 ticks。可以参考 d3-arrayticks.

continuous.tickFormat([count[, specifier]]) 格式化的刻度尺

返回一个调整小时刻度值的 number format 函数。count 应该与通过 tick values 指定的 count 相同。

  1. var x = d3.scaleLinear()
  2. .domain([-1, 1])
  3. .range([0, 960]);
  4. var ticks = x.ticks(5),
  5. tickFormat = x.tickFormat(5, "+%");
  6. ticks.map(tickFormat); // ["-100%", "-50%", "+0%", "+50%", "+100%"]

continuous.copy() 复制一个尺度

返回一个当前比例尺的拷贝。返回的拷贝和当前比例尺之间不会相互影响。

continuous.nice([count]) 优化domain使其取整

扩展 domain 使其为整。这个方法通常会修改 domain 将其扩展为最接近的整数值。可选的 count 参数可以用来控制扩展的步长。对 domain 的取整在根据数据计算 domain 时候很有用。比如计算后的 domain 为 [0.201479…, 0.996679…] 时,在经过取整之后会被扩展为 [0.2, 1.0]。如果 domain 包含两个以上的元素,则取整操作仅仅影响第一个和最后一个值。参考 d3-arraytickStep 操作。

例子

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>d3 5.15.1</title>
  5. <style>
  6. .text {
  7. text-indent: 2em;
  8. }
  9. .pre {
  10. white-space: pre-wrap;
  11. background-color: #eee;
  12. border: 1px solid #ccc;
  13. }
  14. </style>
  15. <script src="../lib/d3.js" type="text/javascript"></script>
  16. </head>
  17. <body>
  18. <a href="../index.html">首页</a>
  19. <br />
  20. <br />
  21. <div class="pre">
  22. var fn = d3.scaleLinear().domain([0, 10]).range([0, 100]);
  23. alert(fn(5)); //
  24. alert(fn(10)); //
  25. alert(fn(11).toFixed(0)); //
  26. var color = d3.scaleLinear()
  27. .domain([0, 32])
  28. .range(["red", "blue"]);
  29. color(20); // "#9a3439"
  30. color(50); // "#7b5167"
  31. var body = d3.select('body');
  32. var data = [];
  33. for (let i = 0; i < 32; i++) {
  34. data.push(color(i));
  35. }
  36. body.selectAll('.color').data(data).enter().append("div").style("color", function (d) {
  37. return d;
  38. }).text(function (d) {
  39. return d;
  40. })
  41. var x = d3.scaleLinear()
  42. .domain([10, 130])
  43. .range([0, 960]);
  44. alert(x.invert(960)); // 130
  45. alert(x.invert(0)); // 10
  46. Domain 定义域 range 映射域
  47. var color = d3.scaleLinear()
  48. .domain([-1, 0, 1])
  49. .range(["red", "white", "green"]);
  50. var colorData = [
  51. color(-0.5), // "rgb(255, 128, 128)"
  52. color(+0.5), // "rgb(128, 192, 128)"
  53. ]
  54. body.selectAll('.color1').data(colorData).enter().append("div").style("color", function (d) {
  55. return d;
  56. }).text(function (d) {
  57. return d;
  58. })
  59. </div>
  60. <script>
  61. var fn = d3.scaleLinear().domain([0, 10]).range([0, 100]);
  62. alert(fn(5)); //
  63. alert(fn(10)); //
  64. alert(fn(11).toFixed(0)); //
  65. var color = d3.scaleLinear()
  66. .domain([0, 32])
  67. .range(["red", "blue"]);
  68. color(20); // "#9a3439"
  69. color(50); // "#7b5167"
  70. var body = d3.select('body');
  71. var data = [];
  72. for (let i = 0; i < 32; i++) {
  73. data.push(color(i));
  74. }
  75. var div = body.selectAll('.color').data(data).enter().append("div").style("color", function (d) {
  76. return d;
  77. }).text(function (d) {
  78. return d;
  79. })
  80. var x = d3.scaleLinear()
  81. .domain([10, 130])
  82. .range([0, 960]);
  83. alert(x.invert(960)); // 130
  84. alert(x.invert(0)); // 10
  85. var color = d3.scaleLinear()
  86. .domain([-1, 0, 1])
  87. .range(["red", "white", "green"]);
  88. var colorData = [
  89. color(-1),
  90. color(-0.5), // "rgb(255, 128, 128)"
  91. color(0),
  92. color(+0.5), // "rgb(128, 192, 128)"
  93. color(1)
  94. ]
  95. body.selectAll('.color1').data(colorData).enter().append("div").style("color", function (d) {
  96. return d;
  97. }).text(function (d) {
  98. return d;
  99. })
  100. </script>
  101. </body>
  102. </html>