如何通过gnuplot-iostream控制XY轴绘制数据折线图?
使用gnuplot-iostream实现折线图并控制坐标轴
下面提供两种实现方案,同时包含坐标轴的自定义控制:
方案1:直接读取本地文件绘制
这种方式和你命令行里的逻辑一致,通过gnuplot-iostream直接加载test.txt文件,同时可以添加坐标轴相关设置:
#include <gnuplot-iostream.h> int main() { Gnuplot gp; // 设置坐标轴标签 gp << "set xlabel 'X 值'\n"; gp << "set ylabel 'Y 值(平方)'\n"; // 设置坐标轴范围(可选) gp << "set xrange [0:13]\n"; gp << "set yrange [0:150]\n"; // 绘制折线图,指定文件路径和绘图样式 gp << "plot 'C:\\\\gnu\\\\test.txt' using 1:2 with lines title 'y = x²'\n"; return 0; }
- 路径里的
\\\\是C++字符串的转义写法,对应实际路径的\ using 1:2指定用文件的第1列作为X轴、第2列作为Y轴title可以给折线添加图例,set xlabel/ylabel设置轴名称,set xrange/yrange限定轴范围
方案2:通过内存数据传递绘制
如果不想依赖本地文件,可以把数据加载到内存,再通过send1d传递给gnuplot:
#include <gnuplot-iostream.h> #include <vector> #include <utility> int main() { Gnuplot gp; // 准备数据:用std::vector<std::pair<double, double>>存储X-Y对 std::vector<std::pair<double, double>> data; for (int i = 1; i <= 12; ++i) { data.emplace_back(i, i*i); } // 设置坐标轴样式 gp << "set xlabel 'X 值'\n"; gp << "set ylabel 'Y 值(平方)'\n"; gp << "set grid\n"; // 可选:添加网格线 // 发送绘图命令,用'-'表示从标准输入读取数据 gp << "plot '-' using 1:2 with lines title 'y = x²'\n"; // 传递内存中的数据 gp.send1d(data); return 0; }
send1d支持多种数据结构,std::vector<std::pair<...>>是最常用的X-Y数据格式- 执行
plot '-'后,gnuplot会等待数据输入,send1d就是把内存数据发送过去 - 同样可以添加各种坐标轴控制命令,比如
set grid开启网格
注意事项
- 确保编译时链接gnuplot-iostream相关库,比如在GCC中需要加上
-lboost_iostreams -lgnuplot_iostream(根据实际环境调整) - 运行前要保证系统中已安装gnuplot,且可执行文件在环境变量路径中
内容的提问来源于stack exchange,提问作者rob18767
相关产品推荐
相关产品推荐

