Graphviz筆記系列導航
Graphviz的腳本語法結(jié)構(gòu)
Graphviz支持digraph(direction graph)有向圖和graph無向圖兩種圖形,腳本的語法非常簡單,并且與C/CPP語法類似:
-
代碼塊(圖或子圖):{}包含的語句是代碼塊 -
語句: 語句以;結(jié)尾(可選)、也 不必強制換行 (但為可讀性建議換行并以;結(jié)尾),語句有:代碼塊語句、節(jié)點語句、連線語句、屬性語句四種 -
實體對象標識符: 可以是C/CPP標識符、數(shù)字、字符串(中文字符串等非英文字符串也可以)、用單引號或雙引號包含的字符串(用于有標點字符或空白字符的字符串),總的來說,Graphviz的實體對象標識符除了特殊字符外均是合法的標識符 -
注釋://表示單行注釋,/*...*/表示多行注釋
Graphviz的三種實體對象和屬性
Graphviz有三類實體對象,在這些實體上可以定義屬性(如:顏色、形狀、文本等):
-
G - Graph(圖):Graph類似于Container(容器)的作用,用于容納N和E -
N - Node(結(jié)點): 相同的標識符被視為同一個節(jié)點 -
E - Edge(連線): 節(jié)點之間的連線
Graphviz的實體對象均在首次定義(即:首次出現(xiàn))時被創(chuàng)建。
Grpahviz圖實體
Graphviz語言支持子圖,子圖中的N和E在不同的代碼塊中,因此,Graphviz的Graph可以細分成三類:
-
G - Graph/Main Graph(圖): 以digraph定義的是有向圖,以graph定義的是無向圖 -
S - Subgraph(子圖): 以代碼塊形式的即是子圖(包括不以cluster開頭定義的subgraph代碼塊),S內(nèi)定義的N和E公共屬性值是代碼塊內(nèi)屬性值,即超出S外,該公共屬性值不起作用,Subgraph本身沒有可顯示的屬性,Subgraph的作用 -
C - Cluster Subgraph(聚集子圖): 以cluster開頭定義的subgraph代碼塊,C不僅有S的容納代碼塊內(nèi)屬性值的作用外,在其內(nèi)定義的N還會被渲染在一個子圖框內(nèi)
子圖的類型(有向圖還是無向圖)與父圖相同,子圖的名稱以cluster開頭才被當成聚集子圖渲染。
digraph graph_name{
bgcolor="transparent";//背景透明
subgraph cluster_subgraph_name{//聚集子圖
node[shape=box];
cluster_A -> cluster_B;
}
subgraph subgraph_name{//子圖
node[shape=none];
sub_A -> sub_B;
}
{//匿名子圖
node[shape=octagon];
nest_A -> nest_B;
}
global_A -> global_B;
cluster_B -> global_B;
sub_B -> global_B;
nest_B -> global_B;
}

Graphviz圖與子圖實體
Grpahviz節(jié)點實體之基本節(jié)點
Graphviz基本節(jié)點就是節(jié)點標識符加上屬性限定符“[]”包圍著的可選節(jié)點屬性,如果基本節(jié)點不定義label屬性值則將節(jié)點標識符作為文本進行顯示。
digraph gv_ex_basic_node{
bgcolor="transparent";//背景透明
node_display_this_id;
node_display_label[label="顯示\n標簽值"];
}

Graphviz節(jié)點實體之基本節(jié)點
Grpahviz節(jié)點實體之HTML節(jié)點
Graphviz的label屬性支持HTML語法,使用HTML語法時:
-
node的shape屬性設置成none -
node的margin屬性設置成0 -
node的label屬性字符串通過尖括號<...>包含HTML語法字符串定義
注:HTML節(jié)點的label屬性值不建議使用引號包含,因為雖然可以被正確渲染,但腳本源碼會失去語法高亮的效果
digraph HTML_label_Example
{
bgcolor="transparent";//背景透明
html_ex_node[shape=none, margin=0, label=<
<table border="0" cellborder="1" cellspacing="0" cellpadding="4">
<tr>
<td rowspan="2">test</td>
<td>a</td>
<td rowspan="2">HTML-Like<br/>label</td>
</tr>
<tr>
<td>b</td>
</tr>
</table>
>];
}

Graphviz節(jié)點實體之HTML節(jié)點
Graphviz節(jié)點實體之Record節(jié)點
當Node的定義為shape = record時,label屬性定義了Node的結(jié)構(gòu),具體為:
-
...|...: 分隔的字符串會在繪制的節(jié)點表現(xiàn)為一條分隔符 -
<...>: 定義了錨點(Anchor),錨點可以被引用為edge的起點或終點,引用語法是${node_id}:${anchor_id},即用:引用node的anchor -
{...}: 花括號里定義的分隔符分隔節(jié)點將從切換方向排布(原水平分隔將變成垂直分隔,原垂直分隔將變成水平分隔)
Graphviz的連線實體
digraph有向圖使用->定義Edge,graph無向圖使用-定義Edge。