メモ帳

メモ帳です.

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

結果として,以下の画像が生成されました.

f:id:tomov3:20160622102839p:plain

ラベルが付与されているのがわかります.

まとめ

BGLとGraphvizを用いることで,簡単にグラフを可視化することができました.
構築したグラフの形状をコードを眺めるだけで理解することは難しいので,このように楽に可視化できればとても便利です.