###### 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