- 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 range
x.invert(-160); // -10, outside domain
x.clamp(true);
x(-10); // 0, clamped to range
x.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)); // 130
alert(x.invert(0)); // 10
Domain 定义域 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)); // 130
alert(x.invert(0)); // 10
var 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>