Graphviz

kt-blackout2004-06-17

Graphvizはグラフを生成/描画するソフトウェアで、doxygenのクラス継承図なんかの生成にも使われている。今までdoxygenを通して使ったことしかなかったが、実は凄い興味があった。そこで、graphvizを通して自分でグラフを作る方法を調べてみたら"超"簡単だった。

方法はdotという形式のファイルを生成して、dot(graphvizのコマンド名)に喰わせれば言い。例えば、

digraph G {
    node [shape = "ellipse"];

    "Node 1" [shape = "box"]

    "Node 1" -> "Node 2";
    "Node 2" -> "Node 1" -> "Node 3" -> "Node 4" -> "Node 2";
    
}

digraphは有向グラフを意味する。後は説明が無くても意味が分かるんじゃないかな? 念のため、ちょっと説明しておくと"XX" -> "YY"で節点XXから節点YYへの有向辺が引かれるというわけ。これで生成されるのが、上にある画像だ。

こういうのを見ると作りたくなるのがC++*1でグラフ構造を表すクラスからdot形式のファイルを生成するものや、直接graphvizライブラリを呼び出して、グラフを生成したりGTK+C++なので、gtkmmか)で表示したりするライブラリ。

まぁ、『作ってみたいものリスト』にいれておこう。

そうそう、偶然だけど面白いことを発見した。知っている人は知っているんだろうけど、displayコマンド(ImageMagicの画像表示コマンド)でdotファイルを喰わせて、画像を表示できる。だから、冒頭のサンプルdotファイルを任意の名前で保存して(仮にgraph.dotとする)以下のコマンドを叩けば画像を表示できる。

display graph.dot

おぉ、簡単。内部でgraphvizを使ってるのかも知れないので、graphvizは必要だと思う(未確認)。

余談だけど、こういう良くできたソフトウェア*2を見るとプログラマの端くれとして感動しちゃんだよね。すごい悔しくもなるし。モチベーションがあがる。

【追記】
グラフ周りの実装ではGraph Template Library(GTL)ってのがありますね。使用感、その他不明。

*1:なんで、C++? 勉強中だから。

*2:ここではソースコードが奇麗とか、設計がすばらしいということではなく、使いやすくて出力が奇麗だというユーザ的な視点でみた『良くできた』という意味。