D3js:何时使用.datum()和.data()?

时间:2012-11-01 16:17:15

标签: d3.js nvd3.js

使用区域图时,我经常会看到.datum。例如:

svg = d3.select("#viz").append("svg").datum(data)

在需要.datum时是否有任何经验法则?

var area = d3.svg.area()  
    .x(function(d) { return x(d.x); })  
    .y0(height)  
    .y1(function(d) { return y(d.y); });  

var svg = d3.select("body").append("svg")  
    .attr("width", width)  
    .attr("height", height);  

svg.append("path") 
    .datum(data)
    .attr("d", area); 

3 个答案:

答案 0 :(得分:33)

我认为文档为这个问题提供了一个很好的答案:https://github.com/mbostock/d3/wiki/Selections#wiki-datum

基本上,关键是在某些情况下,当您进行选择时,您对进入/退出集不感兴趣。如果是这种情况(通常情况下是完整图表的情况),则使用数据。

更新:取决于:当您预计没有动态更新时(在您的示例中似乎就是这种情况),数据是可以的。为什么?因为还没有路径svg元素,所以只有一个路径元素,一旦添加它就不会改变。

如果您在哪里有多个路径元素和动态更改(例如,每隔一秒后删除最旧的数据元素并添加新的数据元素),那么需要数据。这将为您提供三组:不再存在数据的图形元素集,更新数据的元素集以及之前不存在数据项的元素集(分别为输入,更新和出口集)。一旦你需要这个,我建议你阅读d3文档。

显然,计算这三套并非没有成本。在实践中,当您使用“大”(我认为d3可扩展到数千个项目的数据集)数据集时,这应该只会成为一个问题。

答案 1 :(得分:9)

这里有一个非常好的教程示例。 http://bost.ocks.org/mike/selection/#data

答案 2 :(得分:5)

其他人与tutorial相关联,但我认为API reference on selection.datum给出了接受的答案:

  

获取或设置每个选定元素的绑定数据。不像   selection.data方法,此方法不计算连接(因此   不计算进入和退出选择。

由于它不计算连接,因此不需要知道关键功能。因此,请注意两者之间的签名差异,只有data函数接受关键函数

  • selection.datum([value])
  • selection.data([values [,key]])

我认为data的教程提供了另一个更基本的区别,类似于词语的含义"数据"和"数据"。也就是说,前者是复数,后者是单数。因此,数据可以通过两种方式连接起来:

  

通过selection.data加入元素。

     

通过selection.datum分配给个人元素。

@ Hugolpz' gist给出了"群体"的重要性的很好的例子。 vs"个人"。这里,json表示数据数组。请注意datum如何将整个数组绑定到一个元素。 如果我们想要与data实现相同,我们必须先将json放在另一个数组中。

  • var chart = d3.select(" body")。append(" svg")。data([json])
  • var chart = d3.select(" body")。append(" svg")。datum(json)