Javascript 在阈值范围内理解反相器的范围
我正在慢慢地翻阅迈克·博斯托克的《乔洛佩斯地图》,并一边写下每一点,以确保我理解它。我有一点特别难以理解。以下是在线示例: 在代码中的某一点上,Bostock拥有一系列颜色,并将其反向范围(如果输入到颜色比例中,将产生该颜色的最小值和最大值)添加到贴图中。对于每个“d”(两种颜色的数组),他使用color.invertExtent(d)获得最小值和最大值。在函数的末尾,他将“d”值(现在是由两个数字组成的数组,最小值和最大值)返回到映射。这我理解Javascript 在阈值范围内理解反相器的范围,javascript,d3.js,Javascript,D3.js,我正在慢慢地翻阅迈克·博斯托克的《乔洛佩斯地图》,并一边写下每一点,以确保我理解它。我有一点特别难以理解。以下是在线示例: 在代码中的某一点上,Bostock拥有一系列颜色,并将其反向范围(如果输入到颜色比例中,将产生该颜色的最小值和最大值)添加到贴图中。对于每个“d”(两种颜色的数组),他使用color.invertExtent(d)获得最小值和最大值。在函数的末尾,他将“d”值(现在是由两个数字组成的数组,最小值和最大值)返回到映射。这我理解 g.selectAll("rect") .d
g.selectAll("rect")
.data(color.range().map(function(d) {
d = color.invertExtent(d);
if (d[0] == null) d[0] = x.domain()[0];
if (d[1] == null) d[1] = x.domain()[1];
return d;
}))
然而,他还包括两个我不理解的“如果”块。为什么它们是必要的?为什么这个双色数组的d[0]或d[1]会等于“null”?为什么他要把它们分配给x.domain[0](在本例中是600)和x.domain[1],x.domain[1]是860。在什么情况下,结果会是“null”呢?文档中实际描述了这一点。如果你看一下,你会看到: 返回域[x0,x1]中值在范围内对应值的范围,表示从范围到域的反向映射。此方法对于交互非常有用,例如确定与鼠标下像素位置对应的域中的值。例如:
var color = d3.scaleThreshold()
.domain([0, 1])
.range(["red", "white", "green"]);
color.invertExtent("red"); // [undefined, 0]
color.invertExtent("white"); // [0, 1]
color.invertExtent("green"); // [1, undefined]
你看到那些未定义的代码了吗?对于范围的第一个和最后一个值,它们是适当的
问题是,对于矩形的enter选择,不能使用带有未定义
或空
(未定义==null
为真
)的数组。因此,那些if
所做的就是转换这个数组:
[[undefined,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,9],[9, undefined]]
在这一点上:
[[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,9],[9,10]]
这是一个现场演示。首先,如果没有if
s:
var scale=d3.scaleThreshold()
.域(d3.范围(1,9,1))
.范围(d3.范围(9));
console.log(scale.range().map)函数(d){
d=反相器范围的比例(d);
返回d;
}))