用graphviz绘出特殊图形

作者:南火,E-mail:nanhovan@126.com
标题:用graphviz绘出特殊图形
欢迎转载这篇文章,转载时需注明来源,作者,作者E-mail。

先看一幅图形:




若你要画出上面的这一副图你会使用什么样的工具呢?也许你试着直接用Word来画,但你马上发现在Word中要画出这一幅图形可不是那么容易的事;也许你 试着直接用Windows自己带的画图板来画,但你马上也发现还是不容易画出这一幅图形;好了,你开始动用大家伙Adobe工具了,但令你沮丧的是,画出 它可要浪费很多时间。 有没有方便一点的方法呢?答案是使用graphviz吧,它就是专处理此类图形的好手。你可以到 http://www.graphviz.org下载安装,记住了,它不仅免费,还开放源代码呢。根据你使用的操作系统下载相应的graphviz,安装后,只用简单的方法就可绘出上面的图形了。下面的讲解主要针对Linux操作系统,若你用Windows也一样。打开你喜欢的编辑器,在其中输入如下代码:
digraph g {
node [shape = record,height=.1];
node0[label = "<f0> |<f1> G|<f2> "];
node1[label = "<f0> |<f1> E|<f2> "];
node2[label = "<f0> |<f1> B|<f2> "];
node3[label = "<f0> |<f1> F|<f2> "];
node4[label = "<f0> |<f1> R|<f2> "];
node5[label = "<f0> |<f1> H|<f2> "];
node6[label = "<f0> |<f1> Y|<f2> "];
node7[label = "<f0> |<f1> A|<f2> "];
node8[label = "<f0> |<f1> C|<f2> "];
"node0":f2 -> "node4":f1;
"node0":f0 -> "node1":f1;
"node1":f0 -> "node2":f1;
"node1":f2 -> "node3":f1;
"node2":f2 -> "node8":f1;
"node2":f0 -> "node7":f1;
"node4":f2 -> "node6":f1;
"node4":f0 -> "node5":f1;
}
将其使用utf8编码保存为demo.dot(如使用Windows的记事本书写以上代码,保存时选择编码为utf8)。
现打开终端,输入命令:
[my@localhost ~]$dot -Tjpeg demo.dot -o demo.jpeg
-Tjpeg表示输出图片格式为jpeg格式,demo.dot为输入的源代码文件名,-o demo.jpeg表示输出的图片名为demo.jpeg。
你即可得到上面的图形了,是简单的吧。当然你也许感到还是很难,那是你害怕源代码。其实不用害怕,你只需稍划时间即可学会。graphviz使用的是 dot语法,很简单的。现就对dot语法做一简介。dot语言支持三种对象:graphs(图象),nodes(节点),edges(边)。图象对象可以 是有向图(digraph)和无向图(graph)。dot会自动为你的图形进行布局,其布局时使用无向图方式,即把无向图也看成是有向图。在一个主图象 内还可使用sbugraph(子图)来定义节点和边的集合。dot语言语法主要关键字有:graph(无向图),digraph(有向图),nodes (节点),edge(边)。各对象都有属性,nodes(节点),edge(边)对象使用[和]来表示,[]内属性与属性间使用";"隔开。属性具有形式 “属性名=属性值”。而graph(无向图),digraph(有向图)属性可不用[],直接“属性名=属性值”即可。如:
node0[label = "<f0> |<f1> G|<f2> "];
表示节点名为node0,具有属性labe(标签),且标签值为"<f0> |<f1> G|<f2> "(该标签中的<f0>据有特殊含义)。
又如:
main -> init [style=dotted]
表示边对象main -> init据有属性style(样式),且style为dotted(点线)。
graphviz对象在源代码中是如何体现的呢?我们来看下面的源代码:
digraph G { /*表示要画一个名为g的无向图*/
size ="4,4"; /*图象g 的属性size="4,4",即图象大小为4inch×4inch。*/
main [shape=box]; /* 表示main节点,据有属性shape=box,即长方形外形。 */
main -> parse [weight=8]; /*main节点与parse节点之间用箭头连起来,且由main指向parse。实际上也就是
建立了边对象,且边对象属性weight=8,句宽度为8 */
parse -> execute;
main -> init [style=dotted];
main -> cleanup;
execute -> { make_string; printf}
init -> make_string;
edge [color=red]; // so is this
main -> printf [style=bold,label="100 times"];
make_string [label="make a/nstring"];
node [shape=box,style=filled,color=".7 .3 1.0"];/*node是关键字,表示为下面的所有节点的属性赋值*/
execute -> compare;
}
该代码对应图形为:



graphviz读入以上源代码,并开始逐字扫描分析程序。由上面的解释(/**/和//用于graphviz的注释),可以用于知道图象对象是整个源代 码,node1之类的是节点,而用->连着的两个节点是边对象(如main -> cleanup)。graphviz中三种对象各自的对象属性较多,详细的情况请参考graphviz的帮助文档,当然你不用害怕,常用的就那么几个。关 于dot语法这次暂就介绍这么多吧,从上,你可看出dot语法很好理解的吧。完整的语法学习参考graphviz的帮助文档。
再来几张图片看看graphviz能做什么?:





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值