用graphviz画图

关键字: graphviz 图论

原文地址:http://abruzzi.javaeye.com/blog/433278

前言

关于graphviz的介绍,我前面已经有专门的一篇文章了:http://abruzzi.javaeye.com/blog/429042  ,还没有接触过的可以去看一看。

 

基本概念

计算机科学中的数据结构中,图算是最为复杂的一种数据结构了,图G由顶点(vertex),以及连接这些顶点的边(edge)组成,表示为G(V,E),其中V表示顶点的集合,E表示边的集合。图有着非常广阔的应用,如网络拓扑,函数调用结构,模拟神经网络等等。

 

graphviz中,也有对应的数据结构,如node, edge, subgraph等。一般来说,我们只需要定义好顶点,边的属性,graphviz的布局引擎可以自动完成布局工作,使得顶点的分布比较均匀,边的交叉尽可能的少。

 

如下图,为graphviz官方的一个图(UNIX系统的进化图):


布局方式

graphviz提供5中布局方式:

  • dot graphviz的默认布局方式,用于画有向图
  • neato spring-model(基于斥力+张力的布局)
  • twopi 
  • circo 在使用过程中,感觉circo算法布局出来的图形最为合理
  • fdp

比如我另一篇文章介绍的BBMS(基于总线的消息服务) http://code.google.com/p/bbms/  的设计图,分别用dot和circo进行布局,效果如下:



 上图为使用dot布局的结果

 


此图为使用circo进行布局的结果,比dot的布局要漂亮一些。

 

graphviz脚本的代码如下:

 

Graphviz代码    收藏代码
  1. digraph bbms{  
  2.   
  3.     size="7.5,7.5";  
  4.   
  5.     bbms_client1 [shape=box];  
  6.   
  7.     bbms_client2 [shape=box];  
  8.   
  9.     bbms_client3 [shape=box];  
  10.   
  11.     bbms_client4 [shape=box];  
  12.   
  13.     bus_server [shape=box, style="filled", color=".5 .7 1.0"];  
  14.   
  15.     net [style="filled,dotted" color="yellow"];  
  16.       
  17.   
  18.   
  19.     bbms_client1 -> bus_server [label="register", color="green"];  
  20.   
  21.     bus_server -> bbms_client1 [label="notify", color="red"];  
  22.   
  23.   
  24.     bbms_client2 -> bus_server [label="register"];  
  25.   
  26.     bus_server -> bbms_client2 [label="notify"];  
  27.   
  28.       
  29.   
  30.     bbms_client3 -> net -> bus_server [label="register"];  
  31.   
  32.     bus_server -> net -> bbms_client3 [label="notify"];  
  33.       
  34.   
  35.     bbms_client4 -> bus_server [label="register"];  
  36.   
  37.     bus_server -> bbms_client4 [label="notify"];  
  38.   
  39.   
  40. }  

 

使用circo画比较复杂的图,布局会更漂亮,最近在做一个基于java的图布局框架,jraph,初步目标就是可以支持dot和circo布局算法。


Graphviz代码    收藏代码
  1. digraph gbbms{  
  2.   
  3.     node [fontname="verdana"];  
  4.   
  5.     fontname="Verdana";  
  6.   
  7.     size="8,8";  
  8.   
  9.     subgraph busmgr{  
  10.   
  11.         node [shape=box, color=blue];  
  12.   
  13.         label="BUS Manager";  
  14.   
  15.         BUS -> Daemon_Thread [label="Worker Thread"];  
  16.   
  17.     }  
  18.   
  19.   
  20.     subgraph bbmsclient1{  
  21.   
  22.         node [shape=box, color=red];  
  23.   
  24.         color=blue;  
  25.   
  26.         label="BBMS Client /#1";  
  27.   
  28.         notifiableEntry_1 -> Message_1_1;  
  29.   
  30.         notifiableEntry_1 -> Message_1_2;  
  31.   
  32.         notifiableEntry_1 -> Message_1_3;  
  33.   
  34.   
  35.     }  
  36.   
  37.   
  38.     subgraph bbmsclient2{  
  39.   
  40.         node [shape=box, color=grey];  
  41.   
  42.         label="BBMS Client /#2";  
  43.   
  44.         notifiableEntry_2 -> Message_2_1;  
  45.   
  46.         notifiableEntry_2 -> Message_2_2;  
  47.   
  48.         notifiableEntry_2 -> Message_2_3;  
  49.   
  50.     }  
  51.   
  52.   
  53.     notifiableEntry_1 -> BUS [color=green, label="register"];  
  54.   
  55.     notifiableEntry_2 -> BUS [color=green, label="register"];  
  56.   
  57.     BUS -> notifiableEntry_1 [color=red, label="notify"];  
  58.   
  59.     BUS -> notifiableEntry_2 [color=red, label="notify"];  
  60.   
  61. }  

 

从上面的图中可能会得出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).

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值