这看起来很简单,但我似乎无法弄明白。我的大多数背景都是Python和R,这非常简单,但我无法弄清楚如何在D3中完成它。
如何在列中找到最大值?
例如,假设我有一个csv:
country,gdp
USA,55
Japan,22
Kuwait,10
我用
加载到D3 function getData() {
d3.csv("gdp.csv", function(d) {
gdpData = d;
});
}
现在该怎么做?我只想返回值55
(gdp
列中的最高值)。
在Python中,这只是np.max(gdpData['gdp'])
或R max(gdpData$gdp)
。
我使用Math.max(gdpData.gdp)
尝试了Math.max(gdpData['gdp'])
和.keys()
以及其他各种事情,但无济于事。我想我只是在误解D3如何代表数据表。
感谢您的帮助。
答案 0 :(得分:2)
加载数据后,您可以执行以下操作以获取最大值:
var max = d3.max(gdpData, function(d) { return d.gdp; } );
This link可能会帮助您了解您可以通过d3
对阵列执行的不同操作。
答案 1 :(得分:1)
(这只是sparta's answer)
的附录这里有两个初始问题:
gdpData
的全局。这不起作用,因为d3.csv
是异步的。除此之外,d3.csv
不会返回任何内容,因此您也无法将其分配给变量。d
作为回调函数中的第一个参数。不这样做,它引入了不必要的混淆,因为d
在惯用D3中被正常用作大多数匿名函数中的基准参数。使用data
,dataset
,myData
或其他类似内容。所有人都说,将你的功能改为:
d3.csv("gdp.csv", function(data) {
//code here
});
因此,在第一步之后,让我们看看d3.csv
做了什么:
鉴于您的CSV,d3.csv
会创建一个对象数组,其中属性名称为CSV标头,属性值为以下行。在您的情况下,这是数据数组(检查控制台):
var data = d3.csvParse(d3.select("#csv").text());
console.log(data);
pre{
display:none;
}
<script src="https://d3js.org/d3.v4.min.js"></script>
<pre id="csv">country,gdp
USA,55
Japan,22
Kuwait,10</pre>
(注意:我正在使用pre元素加载数据,因为我无法在Stack片段中上传CSV)
然后,要获得最大值,只需使用sparta答案中的代码d3.max
,其中:
使用自然顺序返回给定数组中的最大值。如果数组为空,则返回undefined。可以指定可选的访问器函数,这相当于在计算最大值之前调用array.map(访问器)。
所以,既然你有一个对象数组,你需要:
var max = d3.max(data, d => d.gdp);
以下是:
var max = d3.max(data.map(d => d.gdp));
data.map
返回此数组:
["55", "22", "10"]
并且d3.max
在返回的数组中找到最高值。请注意d3.csv
将CSV值解析为字符串(如上图所示),而不是数字,即使这些值最初是数字。
查看演示:
var data = d3.csvParse(d3.select("#csv").text());
var max = d3.max(data, d => d.gdp);
console.log(max);
pre{
display:none;
}
<script src="https://d3js.org/d3.v4.min.js"></script>
<pre id="csv">country,gdp
USA,55
Japan,22
Kuwait,10</pre>