2014-09-27 81 views
-1

我无法找到下面的代码D3的缺陷:将数据传递到D3的功能

//d3.tsv("dictionaries/dictionary-tsv.tsv", 
//  function(d) { return +d.frequency }, 
//  function(error, rows) { console.log(rows);}, 
//  function(d) { drawExample(data) } 
//  ); 

var data = [1,2,12,4,7]; 
drawExample(data); 

function drawExample(frequency) { 

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

d3.select(".chart") 
    .selectAll("div") 
    .data(frequency) 
    .enter().append("div") 
    .style("width", function(d) { return x(d) + "px"; }) 
    .text(function(d) { return d; }); 
} 

如果你运行,因为它是条形图产生。如果您评论var data和drawExample并取消注释从tsv获取外部数据的方法,则它会失败(Firefox调试器显示数据已加载,并且没有未定义的var显示在任何地方)。另外,计算器链接:

csv to array in d3.js” 和 “variable scope in d3 javascript

似乎并没有帮助。我使用d3.v3.min.js和我的TSV文件如下:

word frequency 
and 1 
be  2 
art 12 
break 4 
cat 7 

我相信,这是我的错误,因此任何帮助,将不胜感激!

回答

0

d3.tsv()不会返回任何东西,它是一个异步调用(就像您在使用jQuery发出AJAX请求时一样)。所以一切都在它的回调中发生。

您的电话应该像这样的事情:

d3.tsv("dictionaries/dictionary-tsv.tsv", function(data){ 
    drawExample(data); 
}); 

不能100%确定(仅涉及与D3连接器上的JSON - 但它应该是相同的,虽然)

+0

但是,我打电话在回调drawExample(数据),就像你说的,不是吗? – pebox11 2014-09-27 20:54:11

+0

不,你在'var data = d3.tsv'(你的代码刚刚更改)中将d3.tsv的结果赋值给var数据,然后在回调函数中传入'd',但是使用'data'。 – topheman 2014-09-27 21:05:18

+0

是的那部分“var data = d3.tsv”确实发生了变化,但是当我改变它时没有人回答。无论如何,我现在正在提及发布的具体问题。对不起,但我做了你的建议,它不起作用。 – pebox11 2014-09-27 21:10:19