我想创建一个序列比例,范围和域之间一一对应。我希望不属于域的值/字符串不会返回任何内容。相反,我得到以下行为:
var x = d3.scaleOrdinal().domain(['a', 'b', 'c']).range([10, 20, 30])
x('d')
10
x('e')
20
x('f')
30
这种行为背后有什么逻辑吗?也许我错过了什么,但我找不到任何东西。
答案 0 :(得分:3)
这是序数量表的预期行为。实际上,D3量表(定量或定性)的制作方式使您可以在域外传递值(请参阅我的answer here)。
如果要为未知输入定义输出,请使用scale.unknown():
var x = d3.scaleOrdinal()
.domain(['a', 'b', 'c'])
.range([10, 20, 30])
.unknown("not in the scale");
console.log("a is " + x("a"));
console.log("b is " + x("b"));
console.log("c is " + x("c"));
console.log("f is " + x("f"));
console.log("xyz is " + x("xyz"));
<script src="https://d3js.org/d3.v4.min.js"></script>
编辑:关于comments中的OP问题:
域外值的范围值是随机选择还是存在逻辑?
可以看到检查source code:
的逻辑function scale(d) {
var key = d + "", i = index.get(key);
if (!i) {
if (unknown !== implicit) return unknown;
index.set(key, i = domain.push(d));
}
return range[(i - 1) % range.length];
}
它告诉我们,如果该值不存在,则将其推入域中。因此,域中未指定的值将具有将在该范围内“循环”的输出。查看此演示,输出为10, 20, 30, 10, 20, 30, 10, 20...
:
var x = d3.scaleOrdinal()
.domain(['a', 'b', 'c'])
.range([10, 20, 30]);
console.log("d is " + x("d"));
console.log("e is " + x("e"));
console.log("f is " + x("f"));
console.log("g is " + x("g"));
console.log("h is " + x("h"));
console.log("i is " + x("i"));
console.log("j is " + x("j"));
<script src="https://d3js.org/d3.v4.min.js"></script>
这与撰写本文的结果相同:
var x = d3.scaleOrdinal()
.domain(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
.range([10, 20, 30]);
在这种情况下,d
对应10,e
对应20,f
对应30等...