D3.js 为什么域不在d3中使用d3.max(数据)?

D3.js 为什么域不在d3中使用d3.max(数据)?,d3.js,D3.js,我对D3还不熟悉,玩的是散点图。我无法让d3.max(数据)在设置域时正常工作 我有以下设置一个随机数据集: var data = []; for (i=0; i < 40; i++){ data.push({"x": i/40, "y": i/8, "a": Math.floor(Math.random() * 3), "x2": Math.random()}); } 这将所有40个点放在一条水平线上。如果我将d3.max(data)

我对D3还不熟悉,玩的是散点图。我无法让d3.max(数据)在设置域时正常工作

我有以下设置一个随机数据集:

var data = [];
      for (i=0; i < 40; i++){
            data.push({"x": i/40, "y": i/8, "a": Math.floor(Math.random() * 3), "x2": Math.random()});
        }
这将所有40个点放在一条水平线上。如果我将d3.max(data)替换为“5”,那么它是一个对角线(尽管从左上角到右下角,我仍然在努力翻转y坐标)。为什么d3.max(数据)不能按预期工作?

d3.max()
需要一个数字数组,而不是对象数组。
data
的元素有一个内部键值结构,
d3.max()。您可以使用类似的方法获取所需对象的元素,然后获取最大值,例如

var maxy = d3.max($.map(data, function(d) { return d.y; }));
编辑:

正如下面的评论中所指出的,您甚至不需要JQuery,因为
.map()
是一种本机数组方法。然后代码变得简单

var maxy = d3.max(data.map(function(d) { return d.y; }));
或者更简单(对于那些没有实现
Array.map()
)的浏览器),使用可选的第二个参数
d3.max
,告诉它如何访问数组中的值

var maxy = d3.max(data, function(d) { return d.y; });

d3.max
API文档可以找到

#d3.max(数组[,存取器])

使用自然顺序返回给定数组中的最大值。如果 数组为空,返回未定义的。一个可选的访问函数 可以指定,这相当于调用array.map(访问器) 在计算最大值之前。与内置的Math.max不同,此 方法忽略未定义的值;这对于计算 一个尺度的域,同时只考虑该尺度的定义区域 数据。此外,使用自然顺序比较元素,而不是 而不是数字顺序。例如,[“20”,“3”]的最大值为“3”, 而[20,3]的最大值为20

将此信息应用于我们得到的原始问题:

function accessor(o){
    return o.y;
}
var y = d3.scale.linear()
        .domain([0, d3.max(data, accessor)])
        .range([0 + margin, h-margin]);
如果您最终使用了许多访问器函数,您可以创建一个工厂

function accessor(key) {
    return function (o) {
        return o[key];
    };
}
var x = d3.scale.linear()
        .domain([0, d3.max(data, accessor('x'))])
        .range([...]),
    y = d3.scale.linear()
        .domain([0, d3.max(data, accessor('y'))])
        .range([...]);

我在处理关联数组时遇到了类似的问题。我的数据如下:[{“年决定”:1982,“总计”:0},{“年决定”:“1983”,“总计”:“847”},…}]

只需在返回值之前传递parseInt即可

var yScale = d3.scale.linear()
    .domain([0, d3.max(query,function(d){ return parseInt(d["Total"]); }) ])
    .range([0,h]);

地图不需要jQuery;这是一个本地数组方法:
d3.max(data.map(函数(d){return d.y;}))
d3.max()
将可选访问器作为其第二个参数,因此您也可以执行
d3.max(数据,函数(d){return d.y;})
var yScale = d3.scale.linear()
    .domain([0, d3.max(query,function(d){ return parseInt(d["Total"]); }) ])
    .range([0,h]);