このブログは新歓ブログリレー2020 64日目の記事です。
こんにちは!Imperiです。
この記事ではmatplotlib-cppを使ってC++からグラフを表示する方法を紹介したいと思います。
matplotlib-cppって何?
これです↓
READMEにも書いてありますが、これはpythonのmatplotlibという便利なグラフ描画パッケージを、C++から使えるようにしたヘッダーオンリーライブラリです。要は、C++からpythonを呼び出してそこからmatplotlibを使っているみたいな感じですね。
matplotlib-cppを入れる
Linux,Macであれば上に載せたREADMEのInstallationに従っていきましょう
Windowsの場合は、/contrib 以下にCMakeを使った設定方法がまとめてあるのでそれに従います
このライブラリ内ではPython.hというpythonを呼び出すためのヘッダーを使っているためコンパイルするときにはそれらへのパスを渡す必要があります。
$ g++ main.cpp -I/usr/include/python2.7 -lpython2.7
一応READMEではpython2.7が勧められていますが自分の環境ではpython3.6を使っても大丈夫だったので、手元の環境に何が入ってるかに合わせてパスを変えてみてください。
$ g++ main.cpp -I/usr/include/python3.6 -lpython3.6m
使ってみる
基本的な使い方は本家のmatplotlibと同様で、x座標を保持しておくvectorとy座標のvectorをplot関数に渡すことでグラフ上にプロットすることが出来ます
#include <matplotlib-cpp/matplotlibcpp.h>
#include <vector>
namespace plt = matplotlibcpp;
int main(){
std::vector<double> x(100),y(100);
for(int i=0;i<100;i++){
x[i]=1.0*i/100;
y[i]=x[i]*x[i];
}
plt::plot(x,y);
plt::save("./sample1.png");
}
またもうすこし関数っぽくコーディングしたい場合にはラムダ式を使って
#include <matplotlib-cpp/matplotlibcpp.h>
#include <vector>
#include <cmath>
namespace plt = matplotlibcpp;
int main(){
std::vector<double> x(100);
for(int i=0;i<100;i++){
x[i]=6.28*i/100;
}
plt::plot(x,[](double a){return std::sin(a);},"r--");
plt::save("./sample2.png");
}
というふうにすることで y=f(x)のグラフを直感的に書くことが出来ます。
またアニメーションにも対応しています
コードは長くなるので省略しますが、僕が前に作ったk-mean法のアニメーションの様子です
これ以外にも、matplotlib上の様々な関数がc++向けに実装されていて、リポジトリの/examples以下にいろいろな例がのっているので使用する際にはぜひチェックしてみてください!
まとめ
matplotlib-cppはmatplotlibをC++から呼び出せるようにしたツールです
このライブラリ本体はヘッダーファイル1つなので自分で修正したり、カスタマイズしたりするのも比較的簡単です。また消す際もそのファイルごと削除してしまえばいいので手元の環境を汚すことも特にありません。なのでぜひお気軽にmatplotlib-cppを使ってみてください!
明日の担当者は@Amanogawa です。明日の記事もお楽しみに!