Golangで有向グラフをかく

背景

言語処理100本ノック 2015をやっている最中に、有向グラフで表示する問題(Q44)に遭遇しました。 gographvizでDOT言語のdotファイルを作成し、graphvizで可視化したのでまとめます。

動作環境

# sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G31

# go version
go version go1.8 darwin/amd64

# dot -V
dot - graphviz version 2.40.1 (20161225.0304)

インストール

graphvizのインストール

# brew install graphviz

gographviz packageのインストール

# go get github.com/awalterschulze/gographviz

有向グラフの作成

設定値などはGraphvizとdot言語でグラフを描く方法のまとめを参考にさせて頂きました。

gist4c915c1e14aae064a92cc30fbcb5eac7

dotファイル上で、Attributionにダブルクオーテーションが必要な場合は、エスケープしないとsyntaxエラーになるので注意してください。
また、今回のように事前のテストができる場合は問題ないですが、Attrを動的に設定するような場合は、以下のようにエラーチェックをしたほうがよいでしょう。

// 例) colorschemeを設定する場合
if _, err := gographviz.NewAttr("colorscheme"); err != nil {
    panic(err)
}
nodeAttrs["colorscheme"] = "rdylgn11" // 問題ないことを確認してからmapに格納する

出力のdotファイルは以下のようになります。

gistc0bdfb47ec6948b6bed5cd51ad92f05c

有向グラフの出力

噂のGraphvizを使ってみるにもありますが、上記で出力したdotファイルをもとに、pngファイルとして結果を出力させるには以下のようにします。

# dot -T png diGraph.dot -o diGraph.png

結果です。いい感じですね。

f:id:cipepser:20170422201356p:plain

Reference