c++でmatplotlibを使う

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})

実行結果

上記サンプルコードを実行すると,このような結果なります.