5

在 D3.js 中使用 data().enter().append() 后,只需使用d.valuename. 但我想在 CSV 列中找到线性比例的最大值。由于比例之前没有任何数据调用,我真的不确定如何指定从中找到最大值的正确列。

这是我失败的尝试。我用什么代替d.column1

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

var x = d3.scale.linear()
    .domain([0, d3.max(d.column1)])
    .range([0, 960]);

编辑:

好的,通过查看类似的示例,我进一步了解了。我不明白为什么我的代码现在不起作用。

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

 data.forEach(function(d) {
    d.column1 = +d.column1;
 });

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

 var x = d3.scale.linear()
     .domain([0, max])
     .range([0, 960]);

编辑#2:

如果问题源于数据本身,这里有一个片段。我尝试删除所有引号,并保留除顶行之外的所有引号,但没有任何效果。

"product", "price"
"bread",20
"meat",100
"meat, sausage",200

编辑#3:

好的,我保证,最后一次编辑。但要绝对清楚;我正在使用 x 比例来确定条形图中条形的宽度:.attr("width", x)并且比例返回 NaN。

4

2 回答 2

7

解释为什么您的代码有效:

data.forEach(function(d) {
  d.column1 = +d.column1;
});

上述语句将所有 column1 值转换为整数(d.column1 前面的 + 号将类型强制为数字)。

一旦您的值都是数字,d3 现在可以将它们作为数字而不是字符串进行比较。这样 10 将大于 9。如果它们是字符串,“9”将大于“10”。

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

上面的行只是取数据数组的最大值。由于您的数据数组由对象组成,因此 d3 无法知道如何将一个对象与另一个对象进行比较。第二个参数是一个函数,它给 d3 一个值给每个对象,以便 d3 可以比较每个对象。在您的情况下,您告诉 d3 使用 column1 来确定最大值。这类似于比较器功能。

于 2013-02-14T02:27:33.047 回答
1

我才意识到问题出在哪里。难怪我们不能一起解决这个问题。上面的所有代码都很好。只是当我调用 x-scale 来确定我的条的宽度时,我没有指定数据中的哪一列将输入到比例中。我有

.attr("width", x)

但现在我将该行更改为:

.attr("width", function(d) { return x(d.column1); })

感谢您的帮助和耐心。

于 2013-02-14T14:42:08.543 回答