【问题标题】:d3.max returns different values for tsv and json (same content)d3.max 为 tsv 和 json 返回不同的值(相同的内容)
【发布时间】:2016-03-23 12:55:44
【问题描述】:

我开始使用 d3。 我有两个数据集,一个在tsv,另一个在json,内容相同。

TSV:

x    y
1    5
5    15
99   105
101  104

我的 tsv 代码:

<script>
   d3.tsv("data/data.tsv", function(error, data) {
       console.log(d3.max(data, function(d) { return d.x; }));
       console.log(d3.max(data, function(d) { return d.y; }));
   });
</script>

d3.max 在这种情况下返回 x = 99 和 y = 5

当我对硬编码的 json 结构做同样的事情时:

 var data =  [
              { "x" : 1, "y" : 5 },
              { "x" : 5, "y" : 15 },
              { "x" : 99, "y" : 105 },
              { "x" : 101, "y" : 104 },
             ];

 console.log(d3.max(data, function(d) { return d.x; }));
 console.log(d3.max(data, function(d) { return d.y; }));

它返回正确的值,x = 101, y = 105。

那我做错了什么? 我检查过,tsv 文件在值之间只包含一个选项卡

【问题讨论】:

  • tsv 将其视为字符串使用d3.tsv.parse(string[, accessor])
  • TSV 版本不会将值转换为数字,因此对字符串值执行最大值计算。字符串比较的工作方式与数字比较不同,因此您会得到不同的结果。

标签: json csv d3.js max


【解决方案1】:

使用

d3.tsv.parse(string[, accessor])

【讨论】:

    【解决方案2】:

    正如其他人在 cmets 中所说,您需要将 x 和 y 转换为数值。为此,请传递一个 accessor 函数,该函数将对每一行进行操作以强制值:

    试试这个:

       d3.tsv("data/data.tsv", 
         function(d){
            return {
              x: +d.x, //<-- convert to float from string 
              y: +d.y
            }
         },
         function(error, data) {
           console.log(d3.max(data, function(d) { return d.x; }));
           console.log(d3.max(data, function(d) { return d.y; }));
         }
       );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多