首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从要在d3.scale.linear()中使用的对象数组中获取最大值.domain()

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

Stack Overflow用户
提问于 2013-05-03 06:22:24
回答 2查看 31.5K关注 0票数 20

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

代码语言:javascript
复制
name, field_goal_attempts, field_goal_makes

我正在尝试使用线性标度,但在获取我的域的最大值时遇到了困难。

代码语言:javascript
复制
var yScale = d3.scale.linear()
               .domain(0, d3.max(...

我对以下几点感到困惑:

1)我应该将yScale函数放在

代码语言:javascript
复制
d3.csv("filename.csv", function(data) {

回调函数;以及

2)如何获取field_goal_attempts列中条目的最大值,然后传入yScale函数。

下面是我目前的代码:

代码语言:javascript
复制
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
        });
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-03 07:50:44

csv文件中的数据将位于您传递给csv函数的回调中(在本例中为" data“参数)。所以你可以在csv函数之外定义yScale,但是如果你想让最大值依赖于数据,你需要在回调中设置它。

至于寻找最大值,许多在数组上工作的D3函数将根据您的场景接受可选的访问器函数。所以计算我会用到的最大值:

代码语言:javascript
复制
var max = d3.max(data, function(d) { return +d.field_goal_attempts;} );

因此,您可以通过以下两种方式将它们组合在一起:

代码语言:javascript
复制
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]);
    ...
}

代码语言:javascript
复制
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.extension(...)它还应该接受一个存取器函数,并返回一个长度为2的数组,其中包含最小值和最大值。

票数 38
EN

Stack Overflow用户

发布于 2013-05-03 07:08:07

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

代码语言:javascript
复制
yScale.domain([0, my_max])

2)为了计算最大值,下面是我通常使用的方法:

代码语言:javascript
复制
//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()确实很棒,但据我所知并不是这样。首先计算列表,然后计算最大值的优点是,如果您想计算最小值、平均值或其他任何值,则需要进行较少的计算。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16348717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档