爱上Graphviz

与其说 Graphviz 是一个开源的画图软件,不如说它是一种画图语言。你把拓扑关系输进去,它会自动生成GIF, PNG, SVG 或者 PostScript 格式的图片。
Graghviz 由一系列软件构成:


  • dot 专门用来生成有层次的有向图。
  • neato  则用于画网络拓扑这类的无向图。
  • 用于编辑的dotty
  • ……
      DOT  的语法很简单。
将下面的代码保存为 hello.dot(只要是.dot 的后缀就行)

digraph G {
    Hello -> World
}


在命令行敲入
dot -Tpng hello.dot -o hello.png

它会生成
 
每门语言的 Hello  World  总是很简单。下面来一个复杂一点的。

digraph G {
 main -> parse -> execute;
 main -> init;
 main -> cleanup;
 execute -> make_string;
 execute -> printf
 init -> make_string;
 main -> printf;
 execute -> compare;
}


它会生成:

可以看出dot 画出来的图是有层次的。其实dot 画图有四个步骤:
  1. 分析输入的拓扑结构,把环打开;
  2. 给结点分配rank (rank 觉得纵坐标);
  3. 调整具有相同rank(就是在同一层) 的结点避免交叉;
  4. 调整横坐标使得边尽可能的短。
下面为这幅图润色:
  • 添加结点属性(shape,width,height,color,……)
            ∑. 可以设置结点的形状(我喜欢用egg,默认是shape=ellipse):
                        main [shape=box]
            ∏. 设置长宽(它是以inch 为单位,默认是width=.75, height=.5):
                          parse [width=1.75, height=1.5]
            ∪. 还有颜色(我喜欢skyblue)
                         execute [box,style=filled,color=skyblue]
           
. 结点的名字默认与代表它的变量名一致,这就限制了名字必须按照变量的取法。这么个缺陷当然不会出现在AT&T 的作品中。Graphviz 提供了label 为结点重命名。
                        make_string [label="make a/nstring"];
          
.  结点的属性基本就这么多,下面是边的属性。
           
⊙. 还可以设置多边形的边数、边缘层叠等(还有skew, distortion,见手册)。如:
                        node [shape=polygon,sides=5,peripheries=3,color=lightblue,style=filled];
  • 修饰边
            ∑. 图里面边与结点同等重要,当然可以命名了
                         main -> printf [label="main/ ->/ printf"]
            ∏. 做为一维的边,我也有自己的力量。可以将某一条边设为虚线、粗线等。

                        main -> init [style=dotted];
                        main -> cleanup [style=bold];

下面来看看整体效果。

digraph G {
 main [shape=box]; /* this is a comment */
 parse [width=1.75, height=1.5]
 execute [box,style=filled,color=skyblue]
 make_string [label="make a/nstring"];
 main -> parse -> execute;
 main -> init [style=dotted];
 main -> cleanup [style=bold];
 execute -> make_string;
 execute -> printf;
 init -> make_string;
 main -> printf [label="main/ ->/ printf"]
 execute -> compare;
}


生成
      



    可见DOT 蛮简单的!其实DOT 真正厉害的还在后面呢!
    看过Sedgewick 的算法书店人都会为里面的插图吸引,不知他用的是什么工具?!(不过最近,他的课件使用keynote画的)
  • 下面用DOT 来画一棵 红黑树:
digraph structs {
	node [shape = triangle, style = filled, color = lightgrey]; "A C"; "E J"; "L P"; "R V"; "X Z";
	node [shape = box, style = rounded]; D; "K Q W";
	{rank = same; "E J" "L P" "R V" "X Z";}
	{rank = same; "A C" "K Q W"}
	
	D -> "A C";
	D -> "K Q W";
	"K Q W" -> "E J";
	"K Q W" -> "L P";
	"K Q W" -> "R V";
	"K Q W" -> "X Z";
	"could be huge" [shape = box, style = filled, color = skyblue];
	"A C" -> "could be huge" [dir = back];
	"E J" -> "could be huge" [dir = back];
	"L P" -> "could be huge" [dir = back];
	"R V" -> "could be huge" [dir = back];
	"X Z" -> "could be huge" [dir = back];
}
生成:


虽然比起原版的要差很多,但毕竟是自己的第一个作品。

原版:


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值