使用区域图时,我经常会看到.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);
答案 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
函数接受关键函数
我认为data
的教程提供了另一个更基本的区别,类似于词语的含义"数据"和"数据"。也就是说,前者是复数,后者是单数。因此,数据可以通过两种方式连接起来:
通过selection.data加入组元素。
通过selection.datum分配给个人元素。
@ Hugolpz' gist给出了"群体"的重要性的很好的例子。 vs"个人"。这里,json
表示数据数组。请注意datum
如何将整个数组绑定到一个元素。 如果我们想要与data
实现相同,我们必须先将json放在另一个数组中。