C++使用gnuplot-cpp库绘制图像

news/2024/11/15 15:20:38/文章来源:https://www.cnblogs.com/CrescentWind/p/18301961

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

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

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

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

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

plot sin(x) with lines
plot sin(x) with points

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

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

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

基础接口

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

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

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

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

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

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

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

绘制给定函数plot_equation

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

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

image
可用的函数有

sin(x)
cos(x)
log(x) // 以e为底的对数
exp(x) // e的x次方
x**a // x的a次方
a**x // a的x次方
// 等等

绘制二维点plot_xy

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

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

image

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

设置图表属性

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

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

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

gp.replot();

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

#include "gnuplot_i.hpp"
int main()
{Gnuplot g10("points");g10.set_smooth();g10.set_style("linespoints");g10.plot_equation3d("sin(x+y)");while (true);return 0;
}

image

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/743679.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分支预测,为什么使用 if/else 语句会降低程序效率

在现代 CPU 架构中,分支预测是为了提高指令执行的效率。然而,如果 if/else 语句的分支走向难以预测,就可能会降低程序效率。这是因为当 CPU 执行到 if/else 语句时,它需要猜测接下来要执行的是 if 分支还是 else 分支。如果 CPU 的预测错误,就需要清空已经预取和执行的部分…

Unraid 连接雷迪司 H1000M UPS 教程

前言 上周六租住的小区更换电表,由于本人未注意贴在楼下的通知,直到断电时往去楼下咨询更换电表的工作人员才知晓通知已经提前一周下达。强制断电对 NAS 的硬盘影响是致命的,于是当机立断购入了雷迪司的这款 NAS 备用电源。选择这款备用电源的原因主要是便宜,Unraid 和 The…

JavaWeb开发基础Servlet简介

Servlet是什么?现在的Java Web开发,很少直接接触到Servlet。在Spring项目中,Spring Boot基于Spring Framework,简化了Spring应用程序开发,Spring Framework是一个全面的Java应用程序框架,其中包含Spring MVC模块,Spring MVC封装了Servlet,以实现Web功能。Servlet不属于…

Pictures

本文来自博客园,作者:haozexu,转载请注明原文链接:https://www.cnblogs.com/haozexu/p/18301944

万字长文:Go 语言流行 ORM 框架 GORM 使用详解

万字长文:Go 语言流行 ORM 框架 GORM 使用详解 原创 江湖十年 Go编程世界 2024年05月18日 08:41 浙江 4人听过GORM 是 Go 语言中最受欢迎的 ORM 库之一,它提供了强大的功能和简洁的 API,让数据库操作变得更加简单和易维护。本文将详细介绍 GORM 的常见用法,包括数据库连接、…

搭建一个javaweb项目的准备流程

搭建一个javaweb项目的准备流程 以所学系统项目为例:1src\main\java\com\utils 1.1tools: DruidTools.java ​ 需要在lib中加入druid-xx-xx.jar包代码展示 package com.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource; import j…

VulnHub-TR0LL: 1靶场实操

本文是对Vulnhub中的Tr0ll:1靶机实操TR0LL: 1靶场实操 靶场信息下载后使用vm打开即可TR0LL1靶场地址:https://www.vulnhub.com/entry/tr0ll-1,100/ 靶场创建时间:2014年8月14日 靶场描述:Tr0ll 的灵感来自于 OSCP 实验室内对机器的不断拖钓。目标很简单,获取 root 权限并从…

申请Lets Encrypt免费SSL证书

Lets Encrypt是一个免费的、开源的、自动化的证书颁发机构(CA),它的出现极大地推动了HTTPS的普及,为互联网的安全做出了巨大的贡献。 通过来此加密网站可以免费申请Lets Encrypt证书。 Lets Encrypt免费SSL证书申请步骤 1. 登录来此加密网站,输入域名,可以勾选泛域名和包…

暑假第一周周报

这周除了个人赛外,还进行了线段树、数状数组的练习。刚开始训练的时候,对线段数和数状数组是缺乏理解,感觉非常非常难,但随着做了越来越多的题。感觉现在是掌握了其中一部分。刚开始学线段树,其中的懒标记感觉不是太会,于是就网上找了一些资料,把那个懒标记的相关知识点…

电影《抓娃娃》迅雷高清版下载[AVI/3.89GB/HD]BT完整版百度云资源

引言电影《抓娃娃》于2024年7月16日在中国大陆上映,由闫非、彭大魔执导,沈腾、马丽领衔主演。这部影片不仅延续了开心麻花团队一贯的喜剧风格,更在幽默与诙谐之中深刻探讨了家庭教育与个人成长的主题。本文将从剧情简介、角色分析、导演手法、主题探讨等方面,对《抓娃娃》进…

进度报告6

(1)1.开始学习面向对象编程,知道基本规则并进行了一定练习 先定义某某类在之中定义变量和函数 之后新建类再调用对象对数据进行处理 (2)继续学习面向对象