1. Graphviz介紹
Graphviz是大名鼎鼎的貝爾實驗室的幾位牛人開發的一個畫圖工具。html
它的理念和通常的「所見即所得」的畫圖工具不同,是「所想即所得」。node
Graphviz提供了dot語言來編寫繪圖腳本。什麼?!畫個圖也須要一個語言!!編程
不要急,dot語言是很是簡單地,只要看了下面幾個列子,就能使用了。數據結構
2. Graphviz的幾個例子
下面的幾個例子都來自於官方文檔。詳情請見:Graphviz官網.ide
2.1 Fancy graph
digraph G{
size = "4, 4";//圖片大小
main[shape=box];/*形狀*/
main->parse;
parse->execute;
main->init[style = dotted];//虛線
main->cleanup;
execute->{make_string; printf}//鏈接兩個
init->make_string;
edge[color = red]; // 鏈接線的顏色
main->printf[style=bold, label="100 times"];//線的 label
make_string[label = "make a\nstring"]// \n, 這個node的label,注意和上一行的區別
node[shape = box, style = filled, color = ".7.3 1.0"];//一個node的屬性
execute->compare;
}
從上面的代碼能夠看出,dot語言很是簡單,就是一個純描述性的語言而已。工具
你們能夠把上面的代碼和下圖中的鏈接對應起來看。post
<圖1. Fancy graph>this
2.2 Polygon graph
digraph G{
size = "4, 4"
a->b->c;
b->d;
a[shape = polygon, sides = 5, peripheries=3, color = lightblue, style = filled];
//個人形狀是多邊形,有五條邊,3條邊框, 顏色的淡藍色, 樣式爲填充
c[shape = polygon, sides = 4, skew= 0.4, lable = "hello world"];
//個人形狀是4變形, 角的彎曲度0.4, 裏面的內容爲"hello world"
d[shape = invtriange];
//我是三角形
e[shape = polygon, side = 4, distortion = .7];
//我是梯形啊
}
下面是對應的圖片:url
<圖2. Polygon graph>spa
2.3 鏈接點的方向
咱們能夠用「n」,」ne」,」e」,」」se」, 「sw」,」w」,」nw」,
分別表示衝哪個方向鏈接這個節點(圖形)-「north, northeast……」
如:
digraph G{
//b->c[tailport = se];
b->c:se;
}
<圖3. Se graph>
2.4 數據結構圖
數據結構圖是咱們很容易用到的一類圖形,一個簡單地數據結構圖代碼以下:
digraph g{
node [shape = record,height=.1//我定義了我下面的樣式;
node0[label = "<f0> |<f1> G|<f2> "];
//我是一個node,我有三個屬性,第二個的名字爲G,其餘兩個爲空
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;
//個人第三個屬性連到node4的第二個屬性
"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;
}
<圖4. Data graph>
2.5 Hash table graph
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];
//我是一個節點,我有7個屬性
node [width = 1.5];
node1[label = "{<n> n14 | 719 |<p>}"];
//我仍是一個節點, 也定義了三個屬性
node2[label = "{<n> a1 | 719 |<p>}"];
node3[label = "{<n> i9 | 512 |<p>}"];
node4[label = "{<n> e5 | 632 |<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;
}
這是一個簡單地哈希表,以下圖所示
<圖5. Hash table graph>
2.6 Process grahp
下面畫一個輕量級的流程圖。
digraph g {
subgraph cluster0 {
//我是一個子圖,subgraph定義了我,
node[style = filled, color = white];
//我以內的節點都是這種樣式
style = filled;
//個人樣式是填充
color = lightgrey;
//個人顏色
a0->a1->a2->a3;
label = "prcess #1"
//個人標題
}
subgraph cluster1 {
//我也是一個子圖
node[style = filled];
b0->b1->b2->b3;
label = "process #2";
color = blue;
}
//定義完畢以後,下面仍是鏈接了
start->a0;
start->b0;
a1->b3;
b2->a3;
a3->end;
b3->end;
start[shape=Mdiamond];
end[shape=Msquare];
}
結果輸出圖形以下:
<圖6. Hash table graph>
3. 小結
相信這幾個列子下來,各位看官對graphviz也有了瞭解了吧,我我的用了一遍下來發現太爽了。
而對於dot語言,做爲一個描述性的語言就很是簡單了, 只要有編程基礎的人,模仿幾個列子下來
應該就能應用了。
各位看官,有沒有心動啊。