2017-02-22 101 views
0

按照Bostock的示例,该行是使用CSV文件中的数据创建的。所以,数据实际上是使用d3.csv()函数加载的。这些都是相当标准的步骤。获取与D3.js中的某一行相关的数据

我在挣扎的是获取x/y轴数据集,而不再从数据文件加载到全局变量。我尝试将data()方法应用于线路,但没有成功,控制台简单地说Array [undefined]

有什么选择/方法可以实现这个目标?您的建议将受到高度赞赏。

+0

你可以包括你的代码 – Craicerjack

+0

相同的代码,博斯托克的例子(https://开头BL .ocks.org/mbostock/3883245),但文件不在CSV文件中。 – Xavier

+0

如果你只是使用该块的代码,并简单地将方法更改为csv,那么我没有看到它的问题,除非你没有改变数据为CSV(逗号分隔与制表符分隔) – Craicerjack

回答

0

与该行关联的数据不是undefined。我猜你使用了d3.select("path")来选择这条线,因为轴是在SVG之前绘制的(当然,轴没有data),所以会选择该轴。

所以,选择的线路,只需设置它的类或ID:

g.append("path") 
    .datum(data) 
    .attr("id", "myLine") 

并使用data()是获取:

console.log(d3.select("#myLine").data()) 

这里是bl.ocks,检查控制台,数据在那里:https://bl.ocks.org/anonymous/e79769c5080a4618b00b946f722d7e39

请记住,如果您试图获取与d3.tsv函数以外的行关联的数据,则必须使用等待,直到该行被绘制在SVG中,因此存在于DOM中。这是使用setTimeout一个例子,与外部d3.tsv的执行console.log:

setTimeout(()=>{console.log(d3.select("#myLine").data());}, 1000); 

和各自bl.ocks:https://bl.ocks.org/anonymous/68ec8087514ff3335d81704796a9a944

+0

非常感谢您的解释。 'setTimeout()'函数确实有效。更有趣的是,无论毫秒参数是“0.00005”,还是“1”或“1000”,它都可以工作。这让我想知道是否有一种方法可以确定“该行是在SVG中绘制的,因此存在于DOM中”。 – Xavier

+0

是的,三个是:在回调结束时放置一个'console.timeEnd'。 –