c++でmatplotlibを使う

pythonには非常に強力なグラフ描画ツール,matplotlibというものがあります.
c++にも何か良いグラフ描画ツールがないかと探してみたところ...
なんと,matplotlib-cppなるものを発見してしまいました.
世の中には便利なものを作ってくれる人がいるもんですね!
ありがたや,ありがたや.

matplotlib-cpp

matplotlib-cppはこちらのgithubにあがっているので、適当な場所にcloneしてきましょう。

lava/matplotlib-cpp

このmatplotlib-cppはヘッダファイルをインクルードするだけで使えるようになるので非常に簡単です。
このヘッダファイルはpythonとmatplotlibに依存していますので、インクルードディレクトリとライブラリパスを指定するのをお忘れなく。

python-matplotlibのインストール

ubuntuには元からpython2.7が入っていますので大丈夫ですが、matplotlibは元から入っているわけではないので、必要な方は以下のコマンドでmatplotlibを入れましょう。

$ sudo apt-get install python-matplotlib

サンプルコード

説明するよりコードを見たほうが早いと思うので、以下にサンプルコードを示しておきます。

#include <matplotlib-cpp/matplotlibcpp.h>

namespace plt = matplotlibcpp;

int main(){
    int n = 1000;
    std::vector<double> x(n), y(n);

    for(int i=0; i<n; ++i) {
        x[i] = 2 * M_PI * i / n;
        y[i] = sin(x[i]);
    }

    plt::plot(x, y);
    plt::show();
}

0~2πの範囲を1000分割にして、y=sin(x)のグラフを表示するサンプルプログラムになります。
xとyのvectorを作ってあげてそこにxとyの点を次々に追加していきます。
後はplot(x,y)とするだけで描画されます。
このように,ほとんどpythonのmatplotlibと同じように使うことができるので、とても簡単です.

コンパイル

<makefile>

コンパイルするときには、-Iオプションでヘッダファイル(matplotlibcpp.h)の場所を明示してあげる必要があります。
また、pythonに依存していますので、そちらのインクルードパスとライブラリパスを明示してあげるのもお忘れなく。

$ g++ sample.cpp -I/usr/include/python2.7 -lpython2.7 -I/hoge/piyo/matplotlib-cpp

matplotlib-cppを/usr/includeに置いて、以下のように使うのがスマートでしょうか。
(gccはデフォルトで/usr/includeディレクトリのヘッダファイルを探しに行ってくれるので)

#include <matplotlib-cpp/matplotlibcpp.h>

$ g++ sample.cpp -I/usr/include/python2.7 -lpython2.7

<cmake>

cmakeの方はこちら

find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
target_link_libraries(hoge ${PYTHON_LIBRARIES})

実行結果

上記サンプルコードを実行すると、このような結果なります。
これでc++でもpythonのmatplotlibと同じような感覚でグラフを手軽に描画できますね!