C++使用gnuplot-cpp库绘制图像
最近想要对一些时变的变量进行可视化,搜索来搜索去选择了使用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");
可用的函数有
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必须为可迭代的对象,且维度一致。
还有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;
}
对于三维图可以拖动来改变视角,ctrl
+滚轮可以放大缩小,shift
+滚轮可以左右平移。
C++使用gnuplot-cpp库绘制图像的更多相关文章
- PHP 使用GD 库绘制图像,无法显示的问题
根据官方GD 库绘制图像文档样式 原基本样式 $width = 120; $height = 50; $img = @imagecreatetruecolor($width, $height) or ...
- 在web中绘制图像 -- canvas篇
汗,不小心点击发布了.其实正在编辑中...... HTML Canvas是现代浏览器中非常棒的绘图技术,Canvas可以绘制图形,操作图片,制作游戏,创建动画等:Canvas是很容易使用的,下面我们来 ...
- 图像语义分割出的json文件和原图,用plt绘制图像mask
1.弱监督 由于公司最近准备开个新项目,用深度学习训练个能够自动标注的模型,但模型要求的训练集比较麻烦,,要先用ffmpeg从视频中截取一段视频,在用opencv抽帧得到图片,所以本人只能先用语义分割 ...
- [python] 基于diagrams库绘制系统架构图
Python的Diagrams库允许通过简单的Python代码绘制云系统架构,实现对新的系统架构进行原型设计.Diagrams的官方仓库地址见:diagrams.Diagrams的官方文档和使用示例见 ...
- Linear regression with one variable算法实例讲解(绘制图像,cost_Function ,Gradient Desent, 拟合曲线, 轮廓图绘制)_矩阵操作
%测试数据 'ex1data1.txt', 第一列为 population of City in 10,000s, 第二列为 Profit in $10,000s 1 6.1101,17.592 5. ...
- Javascript高级编程学习笔记(90)—— Canvas(7) 绘制图像
绘制图像 2D绘图上下文内置了对图像的支持 如果希望将一幅图绘制到画布上,可以使用 drawImage() 的方法 该方法有三种不同的参数数组合以对应不同的应用场景 将<img>绘制到画布 ...
- Python使用turtle库与random库绘制雪花
记录Python使用turtle库与random库绘制雪花,代码非常容易理解,画着玩玩还是可以的. 完整代码如下: 效果图如下:
- php 简单的学习GD库绘制图片并传回给前端实现方式
1.基本的GD库绘制图片汇总 2.后台实现小案例 <?php // $img = imagecreatetruecolor(200,40); // var_dump($img); // 利用GD ...
- iOS:quartz2D绘图(处理图像,绘制图像并添加水印)
绘制图像既可以重写drawRect:方法并在该方法中绘制,也可以不用重写该方法,它有封装好的函数获取自己的图像绘制上下文,即UIGraphicsBeginImageContext(CGSize siz ...
- canvas 绘制图像
结果: 代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ...
随机推荐
- 计算机网络基础 — Linux 虚拟路由器
目录 文章目录 目录 前文列表 前言 Neutron L3 agent 概述 L3 agent的配置 虚拟路由器实现原理 总结 前文列表 <计算机网络基础 - 以太网> <计算机网络 ...
- Idefics2 简介: 为社区而生的强大 8B 视觉语言模型
我们很高兴在此发布 Idefics2,这是一个通用的多模态模型,接受任意文本序列和图像序列作为输入,并据此生成文本.它可用于回答图像相关的问题.描述视觉内容.基于多幅图像创作故事.从文档中提取信息以及 ...
- linux下srpm源码包的使用和安装
目录 一.关于srpm包 二.srpm包和rpm包的区别 三.不对srpm包做修改,直接安装srpm包 四.对srpm包的源码进行修改,然后安装srpm包 一.关于srpm包 SRPM包是Sour ...
- MLP实现波士顿房屋价格回归任务
1. 数据集 波士顿房屋价格.csv文件,文件中的数据有可能不完整,部分数据如下: CRIM, ZN ,INDUS ,CHAS,NOX,RM,AGE,DIS,RAD,TAX,PTRATIO,LSTAT ...
- itest(爱测试) 接口测试,敏捷测试管理平台 10.4.0 发布
一:itest work 简介 itest work 开源敏捷测试管理,包含极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock,还有压测 ,又有丰富的统计分析,8合1工作站.可按 ...
- itest(爱测试)开源接口测试&敏捷测试&极简项目管理 8.0.0 发布,测试重大升级
(一)itest 简介及更新说明 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock 6合1,又有丰富的统计分析.可按测试包 ...
- grid 布局兼容性问题
低版本的安卓机上是不生效的 代码 .grid_4 { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: ...
- c语言不可不说的一件事——进制之间的转化
进制之间的转换 二进制转换 二进制转换为十进制 10111010.101 转换方法: 个位数是乘以2的0次方 从小数点开始分割,(小数点前从右往左,小数点后从左往右)乘以2的对应次方(从0开始取),最 ...
- Linux间进程通信--消息队列
本系列文章主要是学习记录Linux下进程间通信的方式. 常用的进程间通信方式:管道.FIFO.消息队列.信号量以及共享存储. 参考文档:<UNIX环境高级编程(第三版)> 参考视频:Lin ...
- idea 使用 mvn clean package 报错 Could not create local repository at
使用 mac 版本的 idea 打包使用打包命令 mvn clean package 总是报错: [ERROR] Could not create local repository at /Repos ...