D3 - 加载没有标题的数据

时间:2014-07-30 21:53:52

标签: d3.js header load

我刚刚开始使用D3而且刚刚开门我无法上手。我确信解决方案很简单,我无法找到它或理解答案。

我正在尝试在文本文件data.txt中加载数据,但数据没有任何标题;三列,制表符分隔。

06/20/2014 13:00    3666    -134    
06/20/2014 13:10    3744    65    
06/20/2014 13:20    3778    2    
06/20/2014 13:30    3804    2    
06/20/2014 13:40    3865    -1    
06/20/2014 13:50    3924    2    
06/20/2014 14:00    3939    -173    
06/20/2014 14:10    3966    -121    
06/20/2014 14:20    3989    -108    
06/20/2014 14:30    4000    -117    
06/20/2014 14:40    3729    -109    
06/20/2014 14:50    4022    -94    
06/20/2014 15:00    3794    -204    
06/20/2014 15:10    3629    53    
06/20/2014 15:20    3572    179    
06/20/2014 15:30    3847    166

我想用第二列数据画一条线。

我还有一个更大的文件,我想从一行168列长的数据中画一条线:

OFFICIAL,2014-06-30 22:00:00,BAW,361,459,536,591,677,720,725,707,611,524,446,382,339,289,238,183,170,227,393,....

我知道如何根据我对Processing的经验来绘制图形,但我无法弄清楚如何获取数据列和D3代码中标识的数据行。

1 个答案:

答案 0 :(得分:5)

正如您所发现的那样,d3文件解析函数希望数据采用标准表格式,第一行包含列标题。

但是,相同方法的变体可以让您获得更好的控制权(see the d3 API wiki for more)。对于无头数据表,方法是:

  • 使用d3.text(filename, function(error, textString) )读取整个文件而不进行解析。

  • 在回调函数中,使用d3.tsv.parseRows(textString)生成数据数组而不指定列标题。

    var data = d3.tsv.parseRows(textString)
    

    每个数据值将由一个带编号的数组组成,因此您可以将日期作为d[0],时间作为d[1],依此类推。

  • 或者,您可以将自己的标题行创建为一个以制表符分隔的标签字符串,并将其连接到数据文件中文本字符串的开头,并使用parse方法之一

    var headers = ["date","time","data1","data2"].join("\t");
    var data = d3.tsv.parse(headers + textString)
    

在任何一种情况下,最终结果都是一个数据点数组,每个数据点都包含多个值。在设置适当的访问器函数(使用数组表示法或对象名称表示法,具体取决于您是否添加了标题)后,通过将此数组传递给d3.svg.line()函数来计算路径数据。 tutorials section of the wiki中有大量的折线图示例。

对于您在一个CSV文件中作为单行的数据文件,您将要使用上述parseRows方法。这将返回一个单元素数据数组(代表您的一行),但该元素将是您真正感兴趣的数据数组。您必须将初始值切片才能获得数字列表:

    var rowData = d3.tsv.parseRows(textString)[0];
    var data = rowData.slice(3);