c++使用matplotlib画图

目录

  • c++使用matplotlib画图
    • 参考资料
    • qt配置
      • 第一步:拷贝matplotlibcpp.h
      • 第二步:引入python库
      • 第三步:引入头文件位置
    • 例子
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

c++使用matplotlib画图

Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。后来有开源项目lava/matplotlib-cpp为c++做了接口,使得我们可以在c++中使用python的matplotlib库进行绘图

参考资料

Matplotlib 中文:https://www.matplotlib.org.cn/

一些应用实例和vs配置:https://mangoroom.cn/cpp/call-matplotlib-on-cpp.html

matplotlib-cpp接口工程:https://github.com/lava/matplotlib-cpp

Matplotlib for C++使用手册:https://matplotlib-cpp.readthedocs.io/en/latest/

qt配置

我们使用Ubuntu16.04 Qt 5.14.2进行项目配置。

vs的配置以及cmake的配置已经有人写过了(https://mangoroom.cn/cpp/call-matplotlib-on-cpp.html以及https://github.com/lava/matplotlib-cpp),我自己工程使用qt对项目进行配置。

第一步:拷贝matplotlibcpp.h

matplotlib-cpp接口工程中最重要的就是这个matplotlibcpp.h,只需要把它拷贝到自己工程的include文件夹下就可以使用接口。

第二步:引入python库

在matplotlib-cpp接口工程中写过c++对python库的编译

g++ minimal.cpp -std=c++11 -I/usr/include/python2.7 -lpython2.7

使用了库lpython2.7

我们在本地的Ubuntu系统中寻找libpython2.7的动态库

locate libpython2.7

我们的库在/usr/lib/x86_64-linux-gnu下面

/usr/lib/x86_64-linux-gnu/libpython2.7.a
/usr/lib/x86_64-linux-gnu/libpython2.7.so
/usr/lib/x86_64-linux-gnu/libpython2.7.so.1
/usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0

之后我们在qt的工程配置文件中加入这个库

LIBS +=  -L/usr/lib/x86_64-linux-gnu/ -lpython2.7

第三步:引入头文件位置

matplotlibcpp.h中包含了

#include 
#include 

我们需要给工程找到这个h文件的位置

locate Python.h

我们的库在/usr/include/python2.7/目录下

/usr/include/python2.7/Python.h

之后我们在qt的工程配置文件中加入这个h文件位置

INCLUDEPATH += /usr/include/python2.7/

同理再继续引入numpy/arrayobject.h位置

例子

参考:https://github.com/lava/matplotlib-cpp

1

#include "matplotlibcpp.h"
namespace plt = matplotlibcpp;
int main() {
    plt::plot({1,3,2,4});
    plt::show();
}

2

#include "matplotlibcpp.h"
#include 

namespace plt = matplotlibcpp;

int main()
{
    // Prepare data.
    int n = 5000;
    std::vector x(n), y(n), z(n), w(n,2);
    for(int i=0; i

3

#include 
#include "matplotlibcpp.h"

using namespace std;
namespace plt = matplotlibcpp;

int main()
{
    // Prepare data.
    int n = 5000; // number of data points
    vector x(n),y(n);
    for(int i=0; i

4

#include "matplotlibcpp.h"
#include 
#include 

namespace plt = matplotlibcpp;

int main() {
    std::vector t(1000);
    std::vector x(t.size());

    for(size_t i = 0; i < t.size(); i++) {
        t[i] = i / 100.0;
        x[i] = sin(2.0 * M_PI * 1.0 * t[i]);
    }

    plt::xkcd();
    plt::plot(t, x);
    plt::title("AN ORDINARY SIN WAVE");
    plt::save("xkcd.png");
}

5

#include "../matplotlibcpp.h"

namespace plt = matplotlibcpp;

int main()
{
    // u and v are respectively the x and y components of the arrows we're plotting
    std::vector x, y, u, v;
    for (int i = -5; i <= 5; i++) {
        for (int j = -5; j <= 5; j++) {
            x.push_back(i);
            u.push_back(-i);
            y.push_back(j);
            v.push_back(-j);
        }
    }

    plt::quiver(x, y, u, v);
    plt::show();
}

6

#include "../matplotlibcpp.h"

namespace plt = matplotlibcpp;

int main()
{
    std::vector> x, y, z;
    for (double i = -5; i <= 5;  i += 0.25) {
        std::vector x_row, y_row, z_row;
        for (double j = -5; j <= 5; j += 0.25) {
            x_row.push_back(i);
            y_row.push_back(j);
            z_row.push_back(::std::sin(::std::hypot(i, j)));
        }
        x.push_back(x_row);
        y.push_back(y_row);
        z.push_back(z_row);
    }

    plt::plot_surface(x, y, z);
    plt::show();
}

你可能感兴趣的:(工具,c++,python)