我刚刚开始使用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代码中标识的数据行。
答案 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);