This excellent graphic(由mbostock对南方周末)展示了如何使基于预先计算的位置DOM的静态图布局。所有的代码都在主html文档上,所以只是“查看源代码”。
它首先加载数据,然后调用ready
:
queue()
.defer(d3.json, "http://graphics8.nytimes.com/newsgraphics/2013/09/07/director-star-chart/ed9eaa686bc2e11f0657a78d9be292a730c0567a/graph.json")
.defer(d3.json, "http://graphics8.nytimes.com/newsgraphics/2013/09/07/director-star-chart/ed9eaa686bc2e11f0657a78d9be292a730c0567a/layout.json")
.await(ready);
如果你挖的样子以.json文件里面,你会得到的,他们会选择如何捕捉图形数据的意义。
的ready
处理程序是这样开始的:
function ready(error, graph, positions) {
force
.nodes(graph.nodes)
.links(graph.links)
.on("tick", ticked)
.start();
if (positions) force.alpha(.0051);
....
你可以看到,它的初始化力布局并设置其alpha()
一个非常低的数字,信号,布局基本上解决了。因此,在布局由于alpha值较低而停止滴答滴答之前,滴答处理程序ticked()
可能只会被调用一次。
但是,还要注意,将alpha设置为非常低的值是有条件的,具体取决于可用的positions
。因此,如果positions
没有预先加载,因此将是undefined
,布局会反复打勾一段时间,直到它安置在某个位置。这向我暗示,在导出位置的过程中,也使用了呈现此静态布局的相同代码 - 可能带有一些附加代码,但未加载计算的positions
。他们真的很聪明(!)。
用于收集和写入文件位置的代码看起来并不是本页面源代码的一部分,这很合理,但您可以在项目环境中想出一种方法。