使用C++绘图,matplotplusplus

现在大部分编程都是写的python代码,但是python的运行速度很让人诟病。我现在有时候的一个做法是用C++来写一个模块,然后用python调用。接口交互用 pybind11 来进行。有时候一个问题是比如我用C++来对数据进行了一些操作,进行了拟合,或者对数据的加工看起来不对头。如果想要通过图像展示这些,我需要在代码里写一个接口成分,还要写一个python脚本来绘图,实在太麻烦。这种情况最好的解决办法是直接在C++的代码里可以直接绘图,又一个类似matplotlib的工具可以直接调用,简单绘图。查找发现真的有这类工具,我的意思不是 pgplot 等比较老的工具,而是符合现在C++语法的比较新的绘图库。

github 上找到两个这类工具,一个名字叫做 matplotlib-cpp,其实就是通过 pybind11 套了个壳,在C++里直接执行 python 代码,调用 matplotlib。这样做当然是可以的,但是我看相关的代码还是有点复杂,使用起来不是很方便。另一个工具是 matplotplusplus (matplot++),正经用C++实现的一个库,可以在里边用简单的语句轻易绘图。

这个工具在各个linux系统中都可以简单安装,github页面上有提供安装说明。我的系统是 manjaro,但是我发现特别扯的是 yay 安装提供的竟然是静态库!一点点的绘图代码编译出来的可执行文件竟然要将近10M. github上自己动手编译安装的默认教程也是编译成静态库。这个太扯了,作者们是认为简单绘图生成一个10M的可执行文件很有意思么?调用这个库的大部分人应该就是在自己机器上工作,进行简单的数据可视化,不需要把一个生成的可执行文件传递给别的用户直接执行!所以实际上安装的话,我们最好直接从github上下载这个库,然后自己手动编译安装,在编译的时候加上生成动态链接库的选项,具体按照以下命令:

git clone https://github.com/alandefreitas/matplotplusplus.git
cd matplotplusplus
mkdir build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-O2" -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF -DBUILD_SHARED_LIBS=ON
sudo cmake --build . --parallel 2 --config Release
sudo cmake --install .

手动编译安装的库存在 /usr/local/lib 目录下,而不是 /usr/lib 目录。一个可能的情况是 /usr/local/lib 可能没在共享库的默认搜索路径,这样执行代码的时候就会报找不到共享库的错误。解决办法很简单,要么把 /usr/local/lib 添加到 /etc/ld.so.conf 文件里,然后用ldconfig命令来进行刷新。要么把路径加到 环境变量 LD_LIBRARY_PATH

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

这样就正常安装好 matplot 库了。github的项目目录里有很多的 examples 可供参考。作者设计用 cmake 来进行构建。我没学过 cmake, 构建总是因为依赖问题失败。安装成共享库后不需要这么复杂,下边是一个示例。

代码:

#include <cmath>
#include <matplot/matplot.h>

int main() {
  using namespace matplot;
  std::vector<double> x = iota(0, pi / 20, 2 * pi);
  std::vector<double> y = transform(x, [](auto x) { return sin(x); });
  plot(x, y);
  text(pi, 0, "← sin(π)");
  show();
  return 0;
}

使用以下命令来进行编译

g++ -std=c++17 -lmatplot -O2 demo.cpp -o demo

Visits: 164

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

*