javascript – 如何从d3.scale.linear()中使用的对象数组获取最大值domain()

我有一个外部csv文件,数据列如下:

name, field_goal_attempts, field_goal_makes

我试图使用线性规模,但遇到难以获得我的域的最大值.

var yScale = d3.scale.linear()
               .domain(0, d3.max(...

我很困惑:

1)我是否应该将yScale函数放在或外部

d3.csv("filename.csv", function(data) {

回调函数;和

2)如何获取field_goal_attempts列中的项目的最大值,然后进入yScale函数.

这是我现在的代码:

var yScale = d3.scale.linear()
    .domain([0, 4000]) //d3.max(data, function(d) {return d })])
    .range([0, 500]);

d3.csv("test.csv", function (data) {
    svg.selectAll("rect")
        .data(data)
        .enter()
        .append("rect")
        .attr("fill", "blue")
        .attr("x", magic_number) // I'm not concerned about the magic numbers at this point :)
        .attr("y", 0)
        .attr("width", another_magic_number)
        .attr("height", function (d) {
            return d.field_goal_attempts
        })
        .attr("id", function (d, i) {
            return i
        });
});
最佳答案
您的csv文件中的数据将处于您传递给csv函数的回调(在您的情况下为“数据”参数).所以你可以在csv函数之外定义yScale,但是如果你希望max取决于数据,你需要将它设置在回调函数内.

至于找到最大值,在数组上工作的许多D3函数将接受可选的访问器函数来精确地执行您的方案.所以计算我将使用的最大值:

var max = d3.max(data, function(d) { return +d.field_goal_attempts;} );

所以你可以把它们放在一起:两种方式之一:

var yScale = d3.scale.linear().domain(0,100);
d3.csv("test.csv", function(data){
    var max = d3.max(data, function(d) { return +d.field_goal_attempts;} );
    yScale.domain([0,max]);
    ...
}

要么

d3.csv("test.csv", function(data){
    var max = d3.max(data, function(d) { return +d.field_goal_attempts;} );
    var yScale = d3.scale.linear().domain([0,max]);
    ...
}

如果你想要找到max和min,那么我建议使用d3.extent(…),它也应该接受一个访问器函数,并返回一个长度为2的数组,最小值和最小值.

转载注明原文:javascript – 如何从d3.scale.linear()中使用的对象数组获取最大值domain() - 代码日志