通过 c 中的管道而不是文件将数据数组传递给 gnuplot
Posted
技术标签:
【中文标题】通过 c 中的管道而不是文件将数据数组传递给 gnuplot【英文标题】:Passing data array to gnuplot via a pipe in c rather than a file 【发布时间】:2012-03-20 10:11:22 【问题描述】:现在我通过 c 中的管道将文件传递给 gnuplot,如下所示:
fprintf(gnuplotPipe, "plot \"data-file.dat\" using 1:2\n");
有什么方法我不必将数据写入文件然后将其传递给gnuplot,例如以某种方式将数组或流传递给gnuplot,这样我就可以跳过写入文件的过程然后删除文件?任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:当然可以。绘制由一条线连接的两个点的终端命令示例如下:
echo "plot \"< echo -e '4 5\n 3 2'\" w lp pt 2" | gnuplot
如果你想有 postscript 输出,你可以添加以下内容:
echo "set terminal postscript; plot \"< echo -e '4 5\n 3 2'\" w lp pt 2" | gnuplot &> out.ps
如果您现在使用 system() 或 popen()(捕获输出流),其余部分应该很简单。
编辑:似乎存在一些 C(++) - Gnuplot 接口。查看this website,它对 C、C++、Python 和 Fortran 包装器进行了很好的概述。我不确定它们是否是最新的并且可以使用最新的 Gnuplot 版本,但如果不适应应该不会那么困难。
【讨论】:
感谢您的回复,我不确定为什么我需要捕获输出,也许我没有看到您在说什么,图表会在 plot 命令之后自动出现。 可选,以防您打算做的不仅仅是查看数据。对于简单的绘图系统就可以了。 听起来不错,我会试试你的答案,我必须根据你的答案将数组转换为一个巨大的字符数组,这样我才能将它传递给 gnuplot,除非我能以某种方式直接传递数组(双打)本身到 gnuplot? 我稍微更新了我的答案,提供了一个快速搜索后出现的链接。【参考方案2】:Gnuplot 将文件名“-”理解为即将到来的数据。因此,从我目前正在处理的内容中剪切和粘贴:
FILE *f = popen("gnuplot", "w");
fprintf(f, "set term png; "
"set out 'beforeafter.png'\n"
"set xlabel 'before'\n"
"set ylabel 'after'\n"
"plot '-'\n");
//Am using Apophenia in my project, so use its print function to print the data
apop_data_print(dataset, .output_pipe=f);
//or use fprintf directly
for (int i=0; i< data_len; i++)
fprintf(f, "%g %g\n", data_x[i], data_y[i]);
fclose(f);
【讨论】:
以上是关于通过 c 中的管道而不是文件将数据数组传递给 gnuplot的主要内容,如果未能解决你的问题,请参考以下文章
C:为啥你可以通过值传递(给函数)一个结构,而不是一个数组?
我应该如何使用 P/Invoke 将字符串数组传递给 C 库?