好的,我们可以从使用相同数据来比较它们的差异开始学习它(我正在使用d3 v4版本),假设我们有以下数据,使用ordinal
和linear
比例尺:
const data = [1, 2, 3, 4, 5];
const scaleLinear = d3.scaleLinear()
.domain([0, Math.max(...data)]).range([1, 100]);
const scaleOrdinal = d3.scaleOrdinal()
.domain(data).range(['one', 'two', 'three', 'four', 'five']);
现在我们开始调用它们来查看结果:
scaleLinear(1); //20
scaleOrdinal(1); //one
scaleLinear(2); //40
scaleOrdinal(2); //two
scaleLinear(5); //100
scaleOrdinal(5); //five
看一下我们得到的函数和结果,如你所见,在普通函数中,我们将数据映射到我们的范围内,而在线性函数中,我们将其拉伸到范围内,因此在这些情况下,例如
scaleLinear(1)将返回20……我们的域最大值为100,100除以5等于20,因此
scaleLinear(1)是
20,
scaleLinear(2)是
40……。
但正如您所看到的,
scaleOrdinal(1)被映射到范围内的数组,因此它等于
one,
scaleOrdinal(2)等于
two……
所以这就是您可以使用这些比例尺的方法,
scaleLinear对于许多事情都很有用,包括在页面上呈现比例尺,但是
scaleOrdinal更适用于获取有序数据,这就是文档中的解释:
# d3.scaleLinear() <>
构造一个新的连续比例尺,其中单位域为[0,1],单位范围为[0,1],默认插值器和禁用夹紧。线性比例尺是连续定量数据的一个很好的默认选择,因为它们保留了比例差异。每个范围值y都可以表示为域值x的函数:y = mx + b。
d3.scaleOrdinal([range]) <>
构造一个新的有序比例尺,其中包含一个空域和指定的范围。如果未指定范围,则默认为空数组;直到定义了非空范围,否则有序比例尺始终返回undefined。
此外,这是d3深入使用同时使用顺序和线性刻度的很好的示例:
var myData = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
var linearScale = d3.scaleLinear()
.domain([0, 11])
.range([0, 600]);
var ordinalScale = d3.scaleOrdinal()
.domain(myData)
.range(['black', '#ccc', '#ccc']);
d3.select('#wrapper')
.selectAll('text')
.data(myData)
.enter()
.append('text')
.attr('x', function(d, i) {
return linearScale(i);
})
.text(function(d) {
return d;
})
.style('fill', function(d) {
return ordinalScale(d);
});
body {
font-family: "Helvetica Neue", Helvetica, sans-serif;
font-size: 14px;
color: #333;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.2/d3.min.js"></script>
<svg width="800" height="60">
<g id="wrapper" transform="translate(100, 40)">
</g>
</svg>
linear(0.5)
。 - Lars Kotthoff