javascript - D3 线性刻度 NaN
问题描述
下面的代码是我当前的代码。我想将 GeoJSON 中的数据映射到 2 到 50 之间的数字。它返回的唯一内容是 NaN ...
shapes.transition()
.duration(500)
.attr("width", 12)
.attr("height", function(d) {
if (optionArray[i] === "location") {
return 12;
}
if (optionArray[i] === "Average_Age") {
var x = d3.scaleLinear()
.range([2, 50])
.domain(d.properties.Average_Age);
return x(d.properties.Average_Age);
}
});
解决方案
在代码的共享部分中,x
为输入数据集中的每条记录重新定义了比例。这不是必需的,并且会增加开销。
比例尺只应在函数调用x
之外声明一次。.attr("height, [...]"
然后,scaleLinear.domain
函数的参数应该是一个数组,其中包含在输入数据集中找到的最小值和最大值(参见库文档中的示例d3.extent
。实用函数可用于返回这样的数组(阅读:在 d3. js)。
假设您的数据集被调用data
,代码应该是:
var x = d3.scaleLinear()
.range([2, 50])
.domain(d3.extent(data, function(d) { return d.properties.Average_Age; }));
shapes.transition()
.duration(500)
.attr("width", 12)
.attr("height", function(d) {
if (optionArray[i] === "location") {
return 12;
}
if (optionArray[i] === "Average_Age") {
return x(d.properties.Average_Age);
}
});