nagaのプログラム備忘録

自分のぶつかったことや学んだことについて書き残します

~やりたいことのごった煮~

C++で簡単にグラフをプロットしよう

matplotlib を使ってみよう

環境

OS コンパイラ python
Ubuntu 20.04 gcc 9.4.0 Python 3.8

さて、やっていこう

ここでは簡単な紹介に留めさせていただく
いくらでも書いてる人はいるからね

さて、ここでは簡単に導入などを説明する

まずは任意のライブラリ用のディレクトリに移動して

$ git clone https://github.com/lava/matiplotlib-cpp.git

終わり
簡単だね

これはヘッダオンリーライブラリだからヘッダをインクルードすればおk

#include<matplotlibcpp.h>

これで使えるようになった

さて、簡単にグラフをプロットしてみよう

// pyplot.cpp
#include<matplotlib-cpp/matplotlibcpp.h>
#include<vector>

namespace plt = matplotlibcpp;

int main(){
    std::vector<int> x(100), y(100);

    for(int i = 0; i < x.size(); i++){
        x.at(i) = i;
        y.at(i) = x.at(i)*x.at(i);
    }

    plt::plot(x, y);
    plt::save("./target.png");

    return 0;
}

f:id:karupi_neko:20220312000450p:plain
xの2乗に比例

こんな感じになる

ちなみにコンパイルするときは

$ g++ -c pyplot.cpp -lpython3.8 -I/usr/include/python3.8 -I ~/project/includes/ 
$ g++ pyplot.o -o pyplot -lpython3.8 -I/usr/include/python3.8 -I ~/project/includes/

makefileだと

TARGET = pyplot
CC     = g++
CFLAGS = -O2 -std=c++2a -Wall
SRCS   = pyplot.cpp
OBJS   = $(SRCS:%.cpp=%.o)
INC    = -I/usr/include/python3.8 -I ~/project/includes/
LIB    = -lpython3.8
.PHONY: all clean

all:$(TARGET)

$(TARGET):$(OBJS)
  $(CC) $^ -o $@ $(LIB) $(CFLAGS) $(INC)

.cpp.o:
  $(CC) -c $^ $(LIB) $(INC) $(CFLAGS)

clean:
  rm -f *.o pyplot

-lpython3.8 というように静的なファイルをリンクする必要がある
自分の手元のpythonのバージョンを確認しましょう

クローンもとのリポジトリではpython2.7を使ってるけどまぁpython3.8でいけたので大体どのバージョンでもいけるだろう

matplotlibの機能は他にもあるので調べてみてもいいだろう

予告: Serial Portの入力をプロットできるようにするのでお楽しみに