graphviz的工具dot主要有6种filter:
- dot
- neato
- twopi
- circo
- fdp
- sfdp
其中dot可以用来绘制有向图,但是似乎是要在原始graph里面有layout信息
neato用来绘制无向图,layout的结果是根据force-directed algorithms也就是spring algorithms算出来的。spring layout是一个对现实进行模拟的很好例子,它利用胡克定律和库伦定律,node之间的作用力由node本身相互之间的吸引力和斥力以及edge上的弹力所决定。经过多次迭代,最终会达到一个力平衡的状态。之前在做training project时还写了一个javascript版的spring layout.
而nodes之间的力有库伦定律得出,edges上的力则有胡克定律得出。在这样一个算法中,各个参数和迭代次数的选择对于layout的结果是非常重要的。
twopi是一个绘制radial layout (see G. Wills, Symposium on Graph Drawing GD’97, September, 1997)的filter,首先它会选择一个root node,然后根据其他nodes到root的步长来决定它们分布在那个环上,比如步长为1的就分布在离圆心最近的一个环上,步长为2就分布在离圆心第二远的环上,依次类推。
circo则是根据circular layout (see Six and Tollis, GD ’99 and ALENEX ’99, and Kaufmann and Wiese, GD ’02.)来绘制layout. 该算法和上面的radial layout类似,不同的是会尽量将有biconncted的node group放在一个环上,这样可以尽可能的减少环与环之间的edges. 当graph是一个outerplanar的时候,这个算法绘制出来的是一个plannar layout.
plannar就是平面图,也就是说存在一种绘制方法将graph画在一个平面上而没有边交叉。而outerplannar则是在绘制成为plannar之后,所有的node都处在graph的boundary上,即没有一个node被围在中心。
fdp和sfdp两个filter都是利用了一种spring layout来绘制无向图,这种spring layout manual上说是 “a force-directed approach in the spirit of Fruchterman and Reingold (cf. Software-Practice & Experience 21(11), 1991, pp. 1129-1164)”; 也没有看, 不知道和一般的spring layout有什么区别。后面sfdp实际上是scale-fdp,算法应该是可以多路同时计算的,因此更快,适合于large graphs.