通过 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 库?

Javascript 是不是通过引用或值将数组传递给函数?

将 NSArray 传递给 UITable View 而不是 UILabel [关闭]

为啥我们不能通过值传递数组来函数?

如何通过管道将子进程调用传递给文本文件?