您的位置:首页 > 职场人生

程序员的绘图利器 — Graphviz

2016-12-16 16:00 323 查看
转载自 http://blog.csdn.net/zhangskd/article/details/8250470

概述

 

官网:http://www.graphviz.org/

Graphviz (Graph Visualization Software) 是一个由AT&T实验室启动的开源工具包。DOT是一种图形描述语言,非常简单的,

Graphviz就是用来处理这种语言的工具。只需要简单了解一下DOT语言,就可以用Graphviz绘图了,它对程序员特别有用。

So in short, if you are a programmer, it is born for you。

 

无向图

[java] view
plain copy

graph graphname {  

    a -- b -- c;  

    b -- d;  

}  



 

有向图

[java] view
plain copy

digraph graphname {  

    a -> b -> c;  

    b -> d;  

}  



 

属性

[java] view
plain copy

//DOT语言中,可以对节点和边添加不同的属性。  

  

digraph graphname {  

    //节点的属性,节点的名称  

    a [lable = "Foo"];  

  

    //节点的属性,节点的形状  

    b [shape = box];  

  

    //边的属性,边的颜色  

    a -> b -> c [color = blue];  

  

    //边的属性,边的线状  

    b -> d [style = dotted];  

}  

 

基本图形

[java] view
plain copy

digraph G {  

//把图片的尺寸设为4inch * 4inch  

size = "4,4";  

main [shape = box];  

  

//边的重要程度,默认是1  

main->parse [weight = 8];  

parse->execute;  

  

//点状线  

main->init[style = dotted];  

main->cleanup;  

  

//连接了两条线  

execute->{make_string;printf}  

init->make_string;  

  

//把边的默认颜色设为red  

edge [color = red];  

main->printf [sytle=bold, label = "100times"];  

  

//节点的名称  

make_string [label = "make a\nstring"];  

  

//设置节点的默认属性  

node [shape=box,style =filled,color=lightgrey];  

execute->compare;  

}  

 



 

多边形

[java] view
plain copy

digraph G{  

a -> b -> c;  

b -> d;  

  

/* 形状为多边形,边数为5,外框为3条,颜色为淡蓝,样式为填充 */  

a [shape = polygon, sides = 5, peripheries = 3, color = lightblue, style = filled];  

  

/* 形状为多边形,边数为4,角的倾斜度为0.4,内容为hellow world*/  

c [shape = polygon, sides = 4, skew = 0.4, label = "hello world"];  

  

/* 形状为倒三角,整体旋转30度 */  

d [shape = invtriangle,orientation = 30];  

  

/* 形状为多边形,边数为4,扭曲度为0.7 */  

e [shape = polygon, sides = 4, distortion = 0.7];  

}  

 



 

数据结构

 

(1)复杂的标签

[java] view
plain copy

digraph structs {  

/* 把节点的默认形状设为矩形record,默认的是圆角矩形Mrecord */  

node [shape = record];  

  

struct1 [label = "left|middle|right"];  

struct2 [label = "one|two"];  

struct3 [label = "hello\nworld|{b|{c|d|e}|f}|g|h"];  

  

struct1 -> struct2;  

struct1 -> struct3;  

}  



 

[java] view
plain copy

graph picture {  

//这幅图的名字  

label = "I love you";  

  

//图名字的位置在bottom,也可以是t  

labelloc = b;  

  

//图名字的位置在left,也可以是r  

labeljust = l;  

  

edge[decorate = true];  

  

C -- D [label = "s1"];  

C -- E [label = "s2"];  

C -- F [label = "s3"];  

D -- E [label = "s4"];  

D -- F [label = "s5"];  

  

edge[decorate = false, labelfontcolor = blue, fontcolor = red];  

C1 -- D1 [headlabel = "c1",taillabel = "d1",label = "c1 - d1"];  

}  


 

 

(2)行列对齐

[java] view
plain copy

digraph html {  

rankdir = LR;  

{  

node[shape = plaintext];  

1995 -> 1996 -> 1997 -> 1998 -> 1999 -> 2000 -> 2001;  

}  

{  

node[shape = box, style = filled];  

WAR3 -> Xhero -> Footman -> DOTA:  

WAR3 -> Battleship;  

}  

{rank = same; 1996; WAR3;}  

{rank = same; 1998; Xhero; Battleship;}  

{rank = same; 1999; Footman;}  

{rank = same; 2001; DOTA;}  

}  

 



 

(3)二叉树

[java] view
plain copy

digraph G {  

label = "Binary search tree";  

node [shape = record];  

  

A [label = "<f0>|<f1>A|<f2>"];  

B [label = "<f0>|<f1>B|<f2>"];  

C [label = "<f0>|<f1>C|<f2>"];  

D [label = "<f0>|<f1>D|<f2>"];  

E [label = "<f0>|<f1>E|<f2>"];  

F [label = "<f0>|<f1>F|<f2>"];  

G [label = "<f0>|<f1>G|<f2>"];  

  

A:f0 -> B:f1;  

A:f2 -> C:f1;  

B:f0 -> D:f1;  

B:f2 -> E:f1;  

C:f0 -> F:f1;  

C:f2 -> G:f1;  

}  

 



 

(4)哈希表

[java] view
plain copy

digraph G{  

nodesep = .05;  

rankdir = LR;  

  

node [shape = record,width = .1,height = .1];  

node0 [label = "<f0>|<f1>|<f2>|<f3>|<f4>|<f5>|<f6>|",height = 2.5];  

  

node [width = 1.5];  

node1 [label = "{<n>n14|719|<p>}"];  

node2 [label = "{<n>a1|805|<p>}"];  

node3 [label = "{<n>i9|718|<p>}"];  

node4 [label = "{<n>e5|989|<p>}"];  

node5 [label = "{<n>t20|959|<p>}"];  

node6 [label = "{<n>o15|794|<p>}"];  

node7 [label = "{<n>s19|659|<p>}"];  

  

node0:f0 -> node1:n;  

node0:f1 -> node2:n;  

node0:f2 -> node3:n;  

node0:f5 -> node4:n;  

node0:f6 -> node5:n;  

node2:p -> node6:n;  

node4:p -> node7:n;  

}  

 


 

流程图

[java] view
plain copy

digraph G{  

subgraph cluster0 {  

node [style = filled,color = white];  

style = filled;  

color = lightgrey;  

a0 -> a1 -> a2 -> a3;  

label = "process #1";  

}  

  

subgraph cluster1 {  

node [style = filled];  

b0 -> b1 -> b2 -> b3;  

label = "process #2";  

color = blue;  

}  

  

start -> a0;  

start -> b0;  

a1 -> b3;  

b2 -> a3;  

a3 -> a0;  

a3 -> end;  

b3 -> end;  

start [shape = Mdiamond];  

end [shape = Msquare];  

}  



 

Reference

[1] http://zh.wikipedia.org/zh-cn/DOT语言,DOT语言简明介绍。

[2] http://zh.wikipedia.org/zh/Graphviz,简单背景知识。

[3] Graphviz中文指南。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 画图