学习过程中用到的比例尺总结
在学习 d3、写 Demo 时用到过一些比例尺,但是总是用了就忘,记不住它们的用处,分辨不出什么场景适合用哪种比例尺。于是整理一篇文章记录它们的用处与用法。
scaleLinear()
线性比例尺,最基础常见的比例尺。会将连续的 domain
与连续的 range
以线性的关系对应输出
const scaleLinear = d3.scaleLinear().domain([0, 10]).range([0, 100])
scaleLinear(0) // 0
scaleLinear(2) // 20
scaleLinear(5) // 50
如果用普通 javascript
代码来描述其行为的话,大致应该是
const getScaleLinear = (input, output) => {
const min = input[0]
const max = input.slice(-1)[0]
const minOutput = output[0]
const maxOutput = output.slice(-1)[0]
return (v) => (v - min) / (max - min) * (maxOutput - minOutput)
}
其映射关系图如下
scaleBand()
不连续的 domain
与连续的 range
进行映射。会将 range
依据 domain
的个数进行分段。不知道应该如何最标准的翻译,直接上 Demo 吧。
const scaleBand = d3.scaleBand().domain([0, 1, 2, 3]).range([0, 100]);
scaleBand(0); // 0
scaleBand(1); // 25
scaleBand(2); // 50
scaleBand(3); // 75
scaleBand(4); // undefined <----
scaleBand(8); // undefined
可以观察到,输入的值必须在 domain
中被定义才能得到输出
0, 1, 2, 3
均被定义过,所以输出不是undefined
4, 8
未被定义,所以输出是undefined
。
翻译成 javascript
代码应该是
const getScaleBand = (input, output) => {
const count = input.length
const minOutput = output[0]
const maxOutput = output.slice(-1)[0]
const step = (maxOutput - minOutput) / count
return (v) => {
const index = input.indexOf(v)
return index === -1 ? undefined : index * step + minOutput
}
}
其映射关系图如下
scalePoint()
与 scaleBand()
一样,也是不连续的 domain
与连续的 range
之间的映射。与 scaleBand()
不同的是,scalePoint()
中 domain
的最大/最小值是与 range
中的最大/最小值对应的。domain
中剩余的值会与 range
中相应的值进行对应。
const scalePoint = d3.scalePoint().domain([0, 1, 2, 3]).range([0, 100]);
scalePoint(0); // 0
scalePoint(1); // 33.33333
scalePoint(2); // 66.66666
scalePoint(3); // 100
其映射关系图如下
scaleOrdinal
scaleOrdinal
比 scaleBand
更进一步,是不连续的 domain
与不连续的 range
之间的对应关系。
const scaleOrdinal = d3.scaleOrdinal().domain([0, 1, 2, 3]).range(['北京', '上海', '广州', '深圳'])
scaleOrdinal(0); // 北京
scaleOrdinal(1); // 上海
scaleOrdinal(2); // 广州
scaleOrdinal(3); // 深圳
scaleOrdinal(4); // 北京 <---
可以观察到,当输入 domain
中不存在的值时,scaleOrdinal
会自动寻找对应的值
其映射关系图如下
未完待续
目前我只接触到了上述 4 种比例尺,如果以后遇到了新的比例尺也会继续在这里更新。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于