- d3.scaleLinear 返回 continuous对象 [kənˈtɪnjuəs] 连续的
- continuous.domain([domain]) 设置定义域
- continuous.range([range]) 设置值域
- continuous.rangeRound([range]) 简写
- d3.interpolateRound(a, b) 插值器
- continuous.clamp(clamp) 设置不允许超出边界值
- continuous.interpolate(interpolate) 指定插值器
- continuous.ticks([count]) 刻度尺
- continuous.tickFormat([count[, specifier]]) 格式化的刻度尺
- continuous.copy() 复制一个尺度
- continuous.nice([count]) 优化domain使其取整
- 例子
线性比例尺,创建一个度量匹配值
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]) 简写
等价与
continuous.range(range).interpolate(d3.interpolateRound);
d3.interpolateRound(a, b) 插值器
返回一个在两个数值 a 和 b 之间插值的插值器; 这个插值器与 interpolateNumber 类似但是会对返回的结果进行四舍五入。.
continuous.clamp(clamp) 设置不允许超出边界值
在未设置clamp时,则当传入位于 domain 之外的值时会推算出对应的、处于 range 之外的值。
var x = d3.scaleLinear().domain([10, 130]).range([0, 960]);x(-10); // -160, outside rangex.invert(-160); // -10, outside domainx.clamp(true);x(-10); // 0, clamped to rangex.invert(-160); // 10, clamped to domain
continuous.interpolate(interpolate) 指定插值器
如果指定了 interpolate 则设置比例尺的 range 插值器。插值器函数被用来在两个相邻的来自 range 值之间进行插值;这些插值器将输入值 t 归一化到 [0, 1] 之间。如果 factory 没有指定则返回比例尺的当前插值函数。默认为 interpolate. 参考 d3-interpolate 获取更多关于插值器的介绍。
例如,考虑输出范围为三个颜色值:
var color = d3.scaleLinear().domain([-100, 0, +100]).range(["red", "white", "green"]);
内部会创建两个插值器,等价于:
var i0 = d3.interpolate("red", "white"),i1 = d3.interpolate("white", "green");
自定义插值器的一个直接的原因是可以修改插值器的颜色空间,比如使用 HCL 颜色空间:
var color = d3.scaleLinear().domain([10, 100]).range(["brown", "steelblue"]).interpolate(d3.interpolateHcl);
或者自定义 Cubehelix 的 gamma 值:
var color = d3.scaleLinear().domain([10, 100]).range(["brown", "steelblue"]).interpolate(d3.interpolateCubehelix.gamma(3));
注意:default interpolator 可能复用返回值。例如,如果 range 为对象,则 range 插值器总是返回同一个修改后的对象。如果比例尺用来设置样式或者属性,则可以使用这种方式,但是如果你想存储比例尺的返回值,则必须指定自己的插值器或者适当的复制。
continuous.ticks([count]) 刻度尺
返回近似的用来表示比例尺 domain 的 count。如果没有指定 count 则默认为 10. 返回的 tick 值的个数是均匀的并且对人类友好的(比如都为 10 的整数倍),切在 domain 的范围内。ticks 经常被用来显示刻度线或者刻度标记。指定的 count 仅仅是一个参考,比例尺会根据 domain 计算具体的 ticks。可以参考 d3-array 的 ticks.
continuous.tickFormat([count[, specifier]]) 格式化的刻度尺
返回一个调整小时刻度值的 number format 函数。count 应该与通过 tick values 指定的 count 相同。
var x = d3.scaleLinear().domain([-1, 1]).range([0, 960]);var ticks = x.ticks(5),tickFormat = x.tickFormat(5, "+%");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-array 的 tickStep 操作。
例子
<!DOCTYPE html><html><head><title>d3 5.15.1</title><style>.text {text-indent: 2em;}.pre {white-space: pre-wrap;background-color: #eee;border: 1px solid #ccc;}</style><script src="../lib/d3.js" type="text/javascript"></script></head><body><a href="../index.html">首页</a><br /><br /><div class="pre">var fn = d3.scaleLinear().domain([0, 10]).range([0, 100]);alert(fn(5)); //alert(fn(10)); //alert(fn(11).toFixed(0)); //var color = d3.scaleLinear().domain([0, 32]).range(["red", "blue"]);color(20); // "#9a3439"color(50); // "#7b5167"var body = d3.select('body');var data = [];for (let i = 0; i < 32; i++) {data.push(color(i));}body.selectAll('.color').data(data).enter().append("div").style("color", function (d) {return d;}).text(function (d) {return d;})var x = d3.scaleLinear().domain([10, 130]).range([0, 960]);alert(x.invert(960)); // 130alert(x.invert(0)); // 10Domain 定义域 range 映射域var color = d3.scaleLinear().domain([-1, 0, 1]).range(["red", "white", "green"]);var colorData = [color(-0.5), // "rgb(255, 128, 128)"color(+0.5), // "rgb(128, 192, 128)"]body.selectAll('.color1').data(colorData).enter().append("div").style("color", function (d) {return d;}).text(function (d) {return d;})</div><script>var fn = d3.scaleLinear().domain([0, 10]).range([0, 100]);alert(fn(5)); //alert(fn(10)); //alert(fn(11).toFixed(0)); //var color = d3.scaleLinear().domain([0, 32]).range(["red", "blue"]);color(20); // "#9a3439"color(50); // "#7b5167"var body = d3.select('body');var data = [];for (let i = 0; i < 32; i++) {data.push(color(i));}var div = body.selectAll('.color').data(data).enter().append("div").style("color", function (d) {return d;}).text(function (d) {return d;})var x = d3.scaleLinear().domain([10, 130]).range([0, 960]);alert(x.invert(960)); // 130alert(x.invert(0)); // 10var color = d3.scaleLinear().domain([-1, 0, 1]).range(["red", "white", "green"]);var colorData = [color(-1),color(-0.5), // "rgb(255, 128, 128)"color(0),color(+0.5), // "rgb(128, 192, 128)"color(1)]body.selectAll('.color1').data(colorData).enter().append("div").style("color", function (d) {return d;}).text(function (d) {return d;})</script></body></html>
