Graphviz

dot in.dot -o out.png

建議複雜的圖形使用 HTML-like label

record node 使用

這個可以在 label 中透過 | 去分割,並且使用 {} 作為子分割

digraph G {
   graph[rankdir=LR]
   node[shape=Mrecord, fontname="consolas"]
   
    subgraph rank1 {
        root[label="root1"];
        n1[label="<p> parrent | <k> key | <d> degree | <m> mark | {<l> left | <c> child | <r> right } "];
        root-> n1:p;
    } 
    
    subgraph rank2 {
        n2[label="<p> parrent | <k> key | <d> degree | <m> mark | {<l> left | <c> child | <r> right } "];
        root-> n2:p;
    } 
    
    subgraph rank3 {
        n3[label="<p> parrent | <k> key | <d> degree | <m> mark | {<l> left | <c> child | <r> right } "];
        root-> n3:p;
    } 
    
    n2:r -> n3:l; 
    n1:r -> n2:l;
}

關於 edge 連接的位置

參見文件 portPos 的方法,如直接設定 attribute headport, tailport 會發生奇怪的事情

關於節點間隙過小

設定 nodesep (注意這個不是 node 的 margin)

graph[nodesep=3]

邊與節點連接的縫隙太大

可能使用 HTML-like table 的時候,設定到 margin,但是沒有看到邊框,實際上邊框是 margin 的大小,但 nodesep 太小,誤用 margin 的問題。

問題 lost node

發生在 record 形式的時候,改用

Warning: flat edge between adjacent nodes one of which has a record shape - replace records with HTML-like labels

Graphviz