20

我有一个外部 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
        });
});
4

2 回答 2

38

csv 文件中的数据将在您传递给 csv 函数的回调中(在您的情况下为“data”参数)。因此,您可以在 csv 函数之外定义 yScale,但如果您希望最大值依赖于数据,则需要在回调中设置它。

至于找到最大值,许多适用于数组的 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]);
    ...
}

如果你想同时找到最大值和最小值,那么我建议使用 d3.extent(...) 它也应该接受一个访问器函数,并将返回一个长度为 2 的数组,其中包含最小值和最大值。

于 2013-05-02T23:50:44.393 回答
2

d3.csv()1)只要在计算最大值时更新函数内部的域,yScale 就可以留在函数之外。例如,您可以在内部执行以下操作d3.csv()

yScale.domain([0, my_max])

2)要计算最大值,这是我通常使用的方法:

//Create list containing only field_goal_attempts
field_goal_attempts_list = data.forEach(function(d){return d.field_goal_attempts})

//Compute max using d3.max() function
field_goal_attempts_max = d3.max(field_goal_attempts_list)

确实,将这样的功能传递给d3.max()会很棒,但据我所知并非如此。首先计算列表然后计算最大值的优点是,如果你想计算最小值、平均值或其他任何东西,你可以做更少的计算。

于 2013-05-02T23:08:07.223 回答