###### tags: `DOT言語` `Graphviz` # DOT言語を書いてみる [TOC] ## 記述環境 VScodeで書きます。 - Graphviz (dot) language support for Visual Studio Code - Graphviz Preview この2つの拡張機能を入れる あと、DOT言語を画像ファイル(svg, png, jpg) に変換するのに graphvizというコマンドが必要なのでインストール ``` sudo apt install graphviz ``` ## 書き方 おそらく、公式サイトのギャラリーをみて 真似したい書き方をコピペしてくるのが簡単です。 ## 抑えておきたいポイント ### DOT言語の予約後(keyword) プログラミング言語の def とか int とか func とかみたいなの - graph - subgraph - node - edge - cluster もっとたくさんあるかもしれないけど、自分の使う範囲で上げてみました。 これらはDOT言語において意味を持つので変数名にできません。 また大文字を区別しないので node/Node/NODE はすべて同じです。 ### Graph 一番大きな枠組み これがないと始まりません ``` graph G { } ``` 矢印つきグラフを書きたい人は graph を digraph に置き換えてね。 ### Node と Edge - Node : こぶ、節 - Edge : 線、辺 とどのつまり、グラフとはNodeを線でつなげていったものということです。 ```graphviz graph G{ graph[label=一番簡単なDOT言語のグラフ] a -- b -- c -- a } ``` ``` graph G{ graph[label=一番簡単なDOT言語のグラフ] a -- b -- c -- a // あるいは a -- b b -- c c -- a } ``` **a, b, c** : Nodeです。単に文字列でNode名を指定してもいいし、" "で囲んでもいいです。 **\-\-** : Edgeです。digraph(矢印ありグラフ)では代わりに->を使いましょう。 ノードのつながりを表す文は、a -- b -- c -- a のように続けて書いてもいいし、 a--b, b--c, c--a, のように分けて書いてもどっちでもいいです プレーンテキスト上で、Node -- Node というふうに Node同士の線のつながりを記述していくのがDOT言語ということになるようです。 ### GraphやNodeのプロパティ Nodeの形や、Graphの背景色を定義できます。 ```graphviz graph G{ graph[bgcolor=Red] a[shape=circle label="NODE\nA"; style=filled color="#777777"] } ``` ``` graph G{ graph[bgcolor=Red] a[shape=circle label="NODE\nA"; style=filled color="#777777"] } ``` **書式** <style>.orange {color: orange;}</style> <p class="orange">グラフ名[key1=val1 key2=val2 ......] </p> [ ]の中にプロパティを書いていきます。 プロパティは複数かけますが、区切りは スペースでも ; セミコロンでもOK **graph , node , edge** のキーワードを使うと、 そのオブジェクト全てに対してデフォルトプロパティを設定できます。 プロパティを指定せず定義するのと組み合わせて、 タイミングによって異なるオブジェクトを作れるようになります ```graphviz graph G{ node[shape=square] a b c node[shape=triangle] d e f node[shape=elipse] g h i edge[label=" first"] a--g; b--h; c--i edge[label=" second"] g--d; h--e; i--f } ``` ``` graph G{ node[shape=square] a b c node[shape=triangle] d e f node[shape=elipse] g h i edge[label=" first"] a--g; b--h; c--i edge[label=" second"] g--d; h--e; i--f } ``` ## Edgeのプロパティについて ```graphviz graph G{ a--b[label=" まずNodeありき\nEdgeはその次"] } ``` ``` graph G{ a--b[label=" まずNodeありき\nEdgeはその次"] } ``` Node名\-\-Node名[key1=val1 key2 = val2] Edge自体には変数名がなく、 Node同士の関係がEdgeの実体となります。 なので、Node同士の関係を記述するときにプロパティを[ ]で指定しましょう ## Subgraph いわば、グラフの中にあるグラフ。子グラフ。 ```graphviz graph G{ graph[label="MainGraph"] c--d subgraph subG{ graph[label="これはSubgraph"] a--b } } ``` ``` graph G{ graph[label="MainGraph"] c--d subgraph subG{ graph[label="これはSubgraph"] a--b } } ``` ### subgraph cluster○○{} subgraph名を定義するときに、頭に **cluster** とつけると サブグラフに枠とグラフ名がつく ```graphviz graph G{ graph[label="MainGraph"] c--d subgraph clustersubG{ graph[label="これはSubgraph"] a--b } } ``` ``` graph G{ graph[label="MainGraph"] c--d subgraph clustersubG{ graph[label="これはSubgraph"] a--b } } ``` ## Rank 作図するときのNodeの高さにランクをつけることができる。 注意するところは、 **高ランクほど下に行く** ということ 書式 rank=[max | same | min] node rank を書いた直後 に定義したNodeにしか反映されないので注意 ### スコープ{} {rank=max a b c} と書くと、{} 内のノード全てに適用される ```graphviz graph G{ {rank=same a b c} rank=min d e f a -- b a -- d e -- d } ``` ``` graph G{ {rank=same a b c} rank=min d e f a -- b a -- d e -- d } ``` rankを設定していないNodeについては、 - 接続していない : same - 接続している : rank-low -- rank-high ## 勉強した結果を使った作図例 ```graphviz graph G{ graph[label="this is MainGraph";bgcolor=green] a[shape=square; label="hello"] b[shape=circle] c[shape=triangle] subgraph cluster1{ graph[label="this is Subgraph1"; color=blue; bgcolor="#606060"] a--b b--c c--a {rank=same; b c} } subgraph clusteraiueo{ graph[label="this is Subgraph2"] d -- e -- f -- d {rank=same; e f} {rank=max; e} } } ``` ``` graph G{ graph[label="this is gtaph";bgcolor=green] a[shape=square; label="hello"] b[shape=circle] c[shape=triangle] subgraph cluster1{ graph[label="this is subgraph1"; color=blue; bgcolor="#606060"] a--b b--c c--a {rank=same; b c} } subgraph clusteraiueo{ d -- e -- f -- d {rank=same; e f} {rank=max; e} } } ``` ## 俺用リファレンス ### 公式サイト http://www.graphviz.org ### NAVERまとめ https://matome.naver.jp/odai/2134852154110576501 ### Qiita **実用例** dot言語を使ってみた https://qiita.com/mrrclb48z/items/477cff04e9a97dcc1aea graphvizでwebの状態遷移図を描く https://qiita.com/hideshi/items/2b671033766b9602c38d pythonパッケージの依存関係をgraphvizで可視化 https://qiita.com/SaitoTsutomu/items/895dc98148942e740312 Python にインストールしたパッケージをグラフにしてみた https://qiita.com/kitsuyui/items/0e72af781ac1a7e3e948 git-flowがよくわからなかったので、Graphvizで書いてみました https://qiita.com/suto3/items/f03cb3c0d4034cbe02fd gvizでAWSの構成図を動的に作成する https://qiita.com/tamikura@github/items/61eeff5dd5adfe22e031 **書き方の参考になりそうなやつ** Graphvizでサーバー構成図を作成 https://qiita.com/iri/items/b93eb59df539b15049e5 Graphvizとdot言語でグラフを描く方法のまとめ https://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d graphvizを使ってPython3で木構造を描く https://qiita.com/shimo_t/items/b761973805f2cf0b2967 ### その他サイト データのビジュアル化を最少の労力で http://www.showa-corp.jp/special/graphtools/graphviz.html