经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++使用gnuplot-cpp库绘制图像
来源:cnblogs  作者:凪风sama  时间:2024/7/15 8:45:31  对本文有异议

最近想要对一些时变的变量进行可视化,搜索来搜索去选择了使用gnuplot这个工具。

  1. sudo apt-get install gnuplot
  2. sudo apt-get install gnuplot-x11 # 使其支持linux终端

这样就安装完gnuplot了。接着可以在命令行中键入gnuplot命令打开gnuplot的交互式环境。由于这里着目于使用c++去画图,因此命令行下的gnuplot用法并不介绍,贴出几个2教程gnuplot,
gnuplot教程

接着为了可以在c++中使用gnuplot,综合各方考虑,选择了使用gnuplot-cpp这个库。
gnuplot-cpp

相较于大多数库都是用linux提供的文件库去使用字符串通过管道传参,gnuplot-cpp这个库有着较好的面向对象特性,较好的封装以及比较简洁的接口。而且其实现仅有一个头文件(gnuplot_i.hpp),不需要去写cmake,非常方便。

唯一的缺点就是没有啥文档。这个库也是我在csdn上看到的,那篇作者也没介绍怎么用。就根据gnuplot的命令行用法来猜测实验确定了一些接口的用法,记录下来。

基础用法

gnuplot-cpp的主要围绕着Gnuplot类进行操作。其构造函数接受一个字符串来指定图表中图像的类型。常用的图像类型有:

  1. 1. lines 即将相邻的点连接成线段
  2. 2. points 仅将每一点使用符号绘出
  3. 3. dots 每一点使用细圆点符号绘出
  4. 4. linespoints 组合linespoints的效果
  5. 5. impulses 每点的位置会额外画出一条垂直于x轴的直线
  6. 6. steps 相邻的点连接成阶梯状线段(即横竖各连接一次)
  7. 7. boxes 相邻的点连接成矩形框,可用来画柱状图

初始化一个Gnuplot对象,并设置图像类型:

  1. #include "gnuplot_i.hpp"
  2. Gnuplot gp(lines); // 默认points

实际上gnuplot命令行模式下绘图的形态是通过with命令来指定的

  1. plot sin(x) with lines
  2. plot sin(x) with points

这里的构造函数相当于给with恒定一个参数。当然gnuplot-cpp(以下称gp)提供了可实时修改的接口。

  1. gp.set_style(points); // 设置图像类型
  2. // 可以更灵活的选择图像类型

后续的绘图中,可以看到gnuplot中大体的设定分为plot和set两个部分。一个用于将数据绘制到图表中,另一个用于设置图表的属性。

基础接口

gp这个库的几乎所有接口都是基于

  1. Gnuplot &Gnuplot::cmd(const std::string &cmdstr)

就像名字一样,cmd即command的,该接口接受一个命令的字符串,并将其发送给gnuplot命令行。主要就是使用cpp的输入输出流将命令通过管道传给gnuplot来执行各种操作。

因此所有封装好的接口的参数大多是字符串命令,然后经过一些标准化处理后使用cmd()接口发送给gnuplot。

其中gp库重载了operator<<来方便的将数据发送给gnuplot。

  1. inline Gnuplot &operator<<(const std::string &cmdstr)
  2. {
  3. cmd(cmdstr);
  4. return (*this);
  5. }
  1. gp << "plot sin(x)" << "with lines";
  2. // 相当于命令行的gunplot环境下直接键入
  3. // plot sin(x) with lines;

需要注意的是,Gnuplot类会在析构时销毁管道文件,也就意味着显示的图像也会销毁,因此需要绘图完使用一些阻塞手段阻塞其析构,如while(true)或者getchar()

绘制给定函数plot_equation

使用plot_equation函数可以绘制给定函数的图像。其接受一个字符串作为函数表达式,以及另一个字符串作为图表的名称。

  1. #include "gnuplot_i.hpp"
  2. Gnuplot gp(lines);
  3. gp.plot_equation("sin(x)", "sin");

image
可用的函数有

  1. sin(x)
  2. cos(x)
  3. log(x) // 以e为底的对数
  4. exp(x) // e的x次方
  5. x**a // x的a次方
  6. a**x // a的x次方
  7. // 等等

绘制二维点plot_xy

使用plot_xy函数可以绘制二维点的图像。其接受一个二维数组作为数据,以及另一个字符串作为图表的名称。

  1. template <typename X, typename Y>
  2. Gnuplot &plot_xy(const X &x, const Y &y, const std::stringtitle = "");
  1. #include "gnuplot_i.hpp"
  2. #include <vector>
  3. using namespace std;
  4. Gnuplot gp(linespoints);
  5. vector<int> x{1, 2, 3, 4, 5};
  6. vector<int> y{1, 4, 9, 16, 25};
  7. gp.plot_xy(x, y, "points"); // 注意x/y必须为可迭代的对象,且维度一致。

image

还有plot_x以及plot_xyz接口的用法与plot_xy类似,这里不再赘述。

设置图表属性

gnuplot-cpp提供了一些接口来设置图表的属性。

  1. gp.set_title(const std::string &title); // 设置图表标题
  2. gp.set_xlabel(const std::string &xlabel); // 设置x轴标签
  3. gp.set_ylabel(const std::string &ylabel); // 设置y轴标签
  4. gp.set_xrange(const double iFrom, const double iTo) // 设置x轴范围
  5. gp.set_yrange(const double iFrom, const double iTo) // 设置y轴范围
  6. gp.set_grid() // 设置网格线
  7. gp.set_title(const std::string &title) // 设置图表标题
  8. gp.set_yautoscale() // 设置y轴自动缩放
  9. gp.set_xautoscale() // 设置x轴自动缩放
  10. // 还有一些其他属性设置接口可以自己结合

当设置完毕后,可以调用replot()重新plot数据,使其在新设置的属性下重新绘制。

  1. gp.replot();

最后给出使用gnuplot-cpp绘制三维图像的例子。

  1. #include "gnuplot_i.hpp"
  2. int main()
  3. {
  4. Gnuplot g10("points");
  5. g10.set_smooth();
  6. g10.set_style("linespoints");
  7. g10.plot_equation3d("sin(x+y)");
  8. while (true);
  9. return 0;
  10. }

image

对于三维图可以拖动来改变视角,ctrl+滚轮可以放大缩小,shift+滚轮可以左右平移。

原文链接:https://www.cnblogs.com/CrescentWind/p/18301961

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号