Boost Graph LibraryとGraphvizでグラフの可視化
グラフの可視化
BGLとGraphvizを用いてグラフを可視化します.
Boost Graph Library: write graphviz - 1.61.0
を参考にしました.
macの場合,Graphvizのinstallはbrewで簡単に行うことができます(それ以外の方法は調査していません..).
brew install graphviz
また,boostのinstallもbrewで同様に実行可能です.
brew install boost
ソースコード
#include <fstream> #include <string> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/graphviz.hpp> int main() { boost::adjacency_list<> g; std::string labels = "R1234"; auto root = boost::add_vertex(g); auto node1 = boost::add_vertex(g); auto node2 = boost::add_vertex(g); auto node3 = boost::add_vertex(g); auto node4 = boost::add_vertex(g); boost::add_edge(root, node1, g); boost::add_edge(root, node2, g); boost::add_edge(node1, node3, g); boost::add_edge(node2, node4, g); std::ofstream file("test.dot"); boost::write_graphviz(file, g, boost::make_label_writer(labels.c_str())); }
まずはじめに,5つのノードと4つのエッジをもつグラフgを構築します.
これはBGLを用いて簡単に行うことができます.
つぎに,write_graphviz()という関数でdotファイルを作成し,これをもとにpngファイルを生成します.
write_graphviz()の出力先はofstreamで指定しています.
dotファイルの中身は次のようになります.
digraph G { 0[label=R]; 1[label=1]; 2[label=2]; 3[label=3]; 4[label=4]; 0->1 ; 0->2 ; 1->3 ; 2->4 ; }
第3引数のmake_label_writer()はノードのラベルを貼る関数です.
これを引数に渡すことで,ノードにラベルが貼られた状態でpngファイルが生成されます.
さいごに,dotコマンドによってpngファイルを生成します.
dot -Tpng test.dot -o test.png
結果として,以下の画像が生成されました.
ラベルが付与されているのがわかります.
まとめ
BGLとGraphvizを用いることで,簡単にグラフを可視化することができました.
構築したグラフの形状をコードを眺めるだけで理解することは難しいので,このように楽に可視化できればとても便利です.