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

Sco*_*ieB 6 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()});
        }
Run Code Online (Sandbox Code Playgroud)

然后以下设置我的坐标:

 var x = d3.scale.linear().domain([0, 1]).range([0 + margin, w-margin]),
            y = d3.scale.linear().domain([0, d3.max(data)]).range([0 + margin, h-margin]),
            c = d3.scale.linear().domain([0, 3]).range(["hsl(100,50%,50%)", "rgb(350, 50%, 50%)"]).interpolate(d3.interpolateHsl);
Run Code Online (Sandbox Code Playgroud)

这将所有40个点放在一条水平线上.如果我用'5'替换d3.max(数据)那么它是一个对角线(尽管从左上角到右下角,我仍然在努力翻转y坐标).为什么d3.max(数据)没有按预期工作?

Lar*_*off 10

d3.max()期望一组数字,而不是对象.元素data具有内部键值结构,无法d3.max()知道最大限度的采取什么.您可以使用类似jQuery的$.map东西来获取所需对象的元素,然后获取最大值,例如

var maxy = d3.max($.map(data, function(d) { return d.y; }));
Run Code Online (Sandbox Code Playgroud)

编辑:

正如下面的评论所指出的,你甚至不需要JQuery,就像.map()本机Array方法一样.然后代码变得简单

var maxy = d3.max(data.map(function(d) { return d.y; }));
Run Code Online (Sandbox Code Playgroud)

甚至更简单(对于那些没有实现的浏览器Array.map()),使用可选的第二个参数d3.max告诉它如何访问数组中的值

var maxy = d3.max(data, function(d) { return d.y; });
Run Code Online (Sandbox Code Playgroud)

  • 你不需要jQuery for map; 它是一个原生的Array方法:`d3.max(data.map(function(d){return dy;}))`.`d3.max()`将一个可选的访问器作为它的第二个参数,所以你也可以做`d3.max(data,function(d){return dy;})` (27认同)