Markdown工具鏈整合 -- Graphviz:腳本基本語法(實體部分)

Graphviz筆記系列導航

  1. Markdown工具鏈整合 -- Graphviz:Graphviz簡介
  2. Markdown工具鏈整合 -- Graphviz:腳本基本語法(實體部分)

Graphviz的腳本語法結(jié)構(gòu)

Graphviz支持digraph(direction graph)有向圖graph無向圖兩種圖形,腳本的語法非常簡單,并且與C/CPP語法類似:

  1. 代碼塊(圖或子圖) {}包含的語句是代碼塊
  2. 語句 語句以;結(jié)尾(可選)、也 不必強制換行 (但為可讀性建議換行并以;結(jié)尾),語句有:代碼塊語句、節(jié)點語句連線語句、屬性語句四種
  3. 實體對象標識符 可以是C/CPP標識符、數(shù)字、字符串(中文字符串等非英文字符串也可以)、用單引號或雙引號包含的字符串(用于有標點字符空白字符的字符串),總的來說,Graphviz實體對象標識符除了特殊字符外均是合法的標識符
  4. 注釋 //表示單行注釋,/*...*/表示多行注釋

Graphviz的三種實體對象和屬性

Graphviz有三類實體對象,在這些實體上可以定義屬性(如:顏色、形狀、文本等):

  1. G - Graph(圖) Graph類似于Container(容器)的作用,用于容納NE
  2. N - Node(結(jié)點) 相同的標識符被視為同一個節(jié)點
  3. E - Edge(連線) 節(jié)點之間的連線

Graphviz的實體對象均在首次定義(即:首次出現(xiàn))時被創(chuàng)建。

Grpahviz圖實體

Graphviz語言支持子圖,子圖中的NE在不同的代碼塊中,因此,GraphvizGraph可以細分成三類:

  1. G - Graph/Main Graph(圖):digraph定義的是有向圖,以graph定義的是無向圖
  2. S - Subgraph(子圖): 以代碼塊形式的即是子圖(包括不以cluster開頭定義的subgraph代碼塊),S內(nèi)定義的NE公共屬性值是代碼塊內(nèi)屬性值,即超出S外,該公共屬性值不起作用,Subgraph本身沒有可顯示的屬性,Subgraph的作用
  3. 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語法時:

  1. nodeshape屬性設置成none
  2. nodemargin屬性設置成0
  3. nodelabel屬性字符串通過尖括號<...>包含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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容