锁定老帖子 主题:用graphviz画图
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-07-26
前言关于graphviz的介绍,我前面已经有专门的一篇文章了:http://abruzzi.iteye.com/blog/429042 ,还没有接触过的可以去看一看。
基本概念计算机科学中的数据结构中,图算是最为复杂的一种数据结构了,图G由顶点(vertex),以及连接这些顶点的边(edge)组成,表示为G(V,E),其中V表示顶点的集合,E表示边的集合。图有着非常广阔的应用,如网络拓扑,函数调用结构,模拟神经网络等等。
graphviz中,也有对应的数据结构,如node, edge, subgraph等。一般来说,我们只需要定义好顶点,边的属性,graphviz的布局引擎可以自动完成布局工作,使得顶点的分布比较均匀,边的交叉尽可能的少。
如下图,为graphviz官方的一个图(UNIX系统的进化图): 布局方式graphviz提供5中布局方式:
比如我另一篇文章介绍的BBMS(基于总线的消息服务) http://code.google.com/p/bbms/ 的设计图,分别用dot和circo进行布局,效果如下:
此图为使用circo进行布局的结果,比dot的布局要漂亮一些。
graphviz脚本的代码如下:
digraph bbms{ size="7.5,7.5"; bbms_client1 [shape=box]; bbms_client2 [shape=box]; bbms_client3 [shape=box]; bbms_client4 [shape=box]; bus_server [shape=box, style="filled", color=".5 .7 1.0"]; net [style="filled,dotted" color="yellow"]; bbms_client1 -> bus_server [label="register", color="green"]; bus_server -> bbms_client1 [label="notify", color="red"]; bbms_client2 -> bus_server [label="register"]; bus_server -> bbms_client2 [label="notify"]; bbms_client3 -> net -> bus_server [label="register"]; bus_server -> net -> bbms_client3 [label="notify"]; bbms_client4 -> bus_server [label="register"]; bus_server -> bbms_client4 [label="notify"]; }
使用circo画比较复杂的图,布局会更漂亮,最近在做一个基于java的图布局框架,jraph,初步目标就是可以支持dot和circo布局算法。 digraph gbbms{ node [fontname="verdana"]; fontname="Verdana"; size="8,8"; subgraph busmgr{ node [shape=box, color=blue]; label="BUS Manager"; BUS -> Daemon_Thread [label="Worker Thread"]; } subgraph bbmsclient1{ node [shape=box, color=red]; color=blue; label="BBMS Client \#1"; notifiableEntry_1 -> Message_1_1; notifiableEntry_1 -> Message_1_2; notifiableEntry_1 -> Message_1_3; } subgraph bbmsclient2{ node [shape=box, color=grey]; label="BBMS Client \#2"; notifiableEntry_2 -> Message_2_1; notifiableEntry_2 -> Message_2_2; notifiableEntry_2 -> Message_2_3; } notifiableEntry_1 -> BUS [color=green, label="register"]; notifiableEntry_2 -> BUS [color=green, label="register"]; BUS -> notifiableEntry_1 [color=red, label="notify"]; BUS -> notifiableEntry_2 [color=red, label="notify"]; }
从上面的图中可能会得出dot布局的结果不如circo的结论,其实不然,dot只是不适用于这个图而已,dot的布局也是非常漂亮的,比如:
这时,如果使用circo,结果就会乱掉,如下:
总结graphviz的好处在于,你只需要关心数据结构的流程,或者连接的方式,而不需要考虑布局。这是经典的*nix的程序的工作方式,比如latex, mate等等,都是采用这种方式来工作的。既可以达到WYTIWYG(What you think is what you get),而不是微软所提倡的WYSIWYG(What you see is what you get).
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 9345 次