###### tags: `linux2022` # graphviz note ## 初始宣告 一開始要用 graph 或 diagraph來宣告圖底,箭頭符號不一樣 ```graphviz= // 無向圖 graph{ a--b; } // 有向圖 digraph{ a->b; } ``` ## 全域描述 如果想套模板到所有點上,可以用 `node` `edge` 來宣告全部的樣式 ```graphviz= digraph{ node [color=orange]; edge [color=red]; a->b; } ``` ```graphviz digraph{ node [color=orange]; edge [color=red]; a->b; } ``` ## 圖片方向 rankdir 設定箭頭方向和排版方向性 [document](https://graphviz.org/docs/attrs/rankdir/) ```graphviz= rankdir = LR; //left to right rankdir = TB; //top to bottom rankdir = BT; //bottom to top ``` ```graphviz digraph{ rankdir = LR; //left to right a->b; label = "LR" } ``` ```graphviz digraph{ label = "RL" rankdir = RL; //left to right a->b; } ``` ## Attributes 用`[]`把參數框起來,每個參數間用逗號隔開 [document](https://graphviz.org/doc/info/attrs.html) ### fillcolor 當`style = filled` 時,設定節點內的顏色 ```graphviz=_ digraph{ a [style=filled, fillcolor = red]; } ``` ```graphviz digraph{ a [style=filled, fillcolor = red]; } ``` ### dir 箭頭方向性 [document](https://graphviz.org/docs/attrs/dir/) ```graphviz= digraph{ a->b [dir=both]; c->d [dir=one]; } ``` ```graphviz digraph{ a->b [dir=both]; c->d [dir=one]; } ``` ### label 文字 ```graphviz= digraph{ a [label="node"]; a->b[label=" arrow"] } ``` ```graphviz digraph{ a [label="node"]; a->b[label=" arrow"] } ``` ### shape 指定 node 或 arrow 形狀 + [arrowshape](https://graphviz.org/doc/info/arrows.html#primitive-shapes) + [node shape](https://graphviz.org/doc/info/shapes.html) ```graphviz= digraph{ edge [dir=both]; a [shape=egg]; a->b [arrowhead=box, arrowtail=tee]; } ``` ```graphviz digraph{ edge [dir=both]; a [shape=egg]; a->b [arrowhead=box, arrowtail=tee]; } ``` 特別的是,Record-based 的 node 可以用特殊語法來宣告 ```graphviz= digraph structs { node [shape=record]; struct1 [label="<f0> left|<f1> mid&#92; dle|<f2> right"]; struct2 [label="<f0> one|<f1> two"]; struct1:f1 -> struct2:f0; struct1:f2 -> struct3:here; } ``` ```graphviz digraph structs { node [shape=record]; struct1 [label="<f0> left|<f1> mid&#92; dle|<f2> right"]; struct2 [label="<f0> one|<f1> two"]; struct1:f1 -> struct2:f0; struct1:f2 -> struct3:here; } ``` 也能用html語法,而ports參數能為節點分區,也可再指定要指在 ewsn 東西南北方向 ```graphviz= digraph{ node1 [ shape = none; style = none; label = <<table border="0" cellspacing="0"> <tr><td port="hlink" border="1" bgcolor="#FFC382">hlink</td></tr> <tr><td port="dlink" border="1" bgcolor="#FFC382">dlink</td></tr> <tr><td border="1"> xxx</td></tr> <tr><td border="1"> xxx</td></tr> </table>> ] node2->node1:hlink:w; node2->node1:dlink:e; } ``` ```graphviz digraph{ node1 [ shape = none; style = none; label = <<table border="0" cellspacing="0"> <tr><td port="hlink" border="1" bgcolor="#FFC382">hlink</td></tr> <tr><td port="dlink" border="1" bgcolor="#FFC382">dlink</td></tr> <tr><td border="1"> xxx</td></tr> <tr><td border="1"> xxx</td></tr> </table>> ] node2->node1:hlink:w; node2->node1:dlink:e; } ``` ## rank 調整排序 [document](https://graphviz.org/docs/attrs/rank/) ```graphviz= digraph{ a;b;c; {rank=same; a b c} d;e; {rank=same; d e} a->e } ``` ```graphviz digraph{ a;b;c; {rank=same; a b c} d;e; {rank=same; d e} a->e; } ``` ## subgraph 在graph中開一個子圖,需以 `cluster` 為開頭 ```graphviz digraph{ c->d; subgraph cluster_1 { a->b; color=red; } } ``` ## reference + [lk list](https://stackoverflow.com/questions/50494263/circular-list-in-graphviz-or-how-to-bend-the-edge) + [double pointer ](https://stackoverflow.com/questions/38410370/edge-pointing-at-edge-with-graphviz-and-dot)