目前我正在尝试创建一个包含数千个节点和约30k个链接的力导向图。正如你所猜测的那样,模拟非常缓慢。相反,我想要预先计算出所有节点的位置,并仅呈现一个静态(但交互式)图形。是否有一种方法可以使用d3.js计算力导向图而不对其进行渲染(使其更快),然后仅从预先计算的值呈现静态图形?我的代码目前基于Mike Bostock的example.。
d3使用的力导向图布局方法是标准的斥力和引力模型,您可以在维基百科上查找伪代码(http://en.wikipedia.org/wiki/Force-based_algorithms_%28graph_drawing%29#Pseudocode),或者查看d3源代码本身(https://github.com/mbostock/d3/blob/master/src/layout/force.js)。该算法每个刻度(或时间片段)的复杂度为O(n^2),达到平衡需要约n个刻度,因此整个布局过程的复杂度为O(n^3)(http://www.ecs.umass.edu/ece/labs/vlsicad/ece665/presentations/Force-Directed-Adel.ppt)。对于成千上万个节点来说,这是不实际的。 为了尝试回答您的具体问题,只需使用CSS,在SVG容器元素上显示:none。一旦初始仿真“最终”完成,您就可以获取SVG元素的HTML源代码,并将其用作静态但交互式表示的基础。(一旦您拥有所有元素的HTML,您只需要将鼠标悬停事件添加到它们上面以显示它们的详细信息即可。