feature image

2020年5月11日 | ブログ記事

matplotlib-cppでC++からグラフを表示する

このブログは新歓ブログリレー2020 64日目の記事です。
こんにちは!Imperiです。
この記事ではmatplotlib-cppを使ってC++からグラフを表示する方法を紹介したいと思います。

matplotlib-cppって何?

これです↓

lava/matplotlib-cpp
Extremely simple yet powerful header-only C++ plotting library built on the popular matplotlib - lava/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 です。明日の記事もお楽しみに!

Imperi icon
この記事を書いた人
Imperi

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2020年5月15日
【新歓ゲーム制作特集 第2弾】Inverse製作秘話
Saltn icon Saltn
2020年5月19日
【新歓ゲーム制作特集 第6弾】個人でゲームを作る話
Facish icon Facish
2020年5月1日
爆☆誕 traQ-S【新歓ブログリレー2020 54日目】
spa icon spa
2020年4月12日
Growl Bassの研究【新歓ブログリレー2020 35日目】
fomalhaut icon fomalhaut
2020年4月6日
はじめてのドット絵
xxpoxx icon xxpoxx
2020年4月3日
猫でもわかる(諸説)OAuth 2.0【新歓ブログリレー2020 26日目】
mazrean icon mazrean
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記