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/
我们使用Ubuntu16.04 Qt 5.14.2进行项目配置。
vs的配置以及cmake的配置已经有人写过了(https://mangoroom.cn/cpp/call-matplotlib-on-cpp.html以及https://github.com/lava/matplotlib-cpp),我自己工程使用qt对项目进行配置。
matplotlib-cpp接口工程中最重要的就是这个matplotlibcpp.h,只需要把它拷贝到自己工程的include文件夹下就可以使用接口。
在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
#include "matplotlibcpp.h"
namespace plt = matplotlibcpp;
int main() {
plt::plot({1,3,2,4});
plt::show();
}
#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
#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
#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");
}
#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();
}
#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();
}