如何在C++中实时使用Gnuplot绘制图形?

11

我正在尝试使用GNUplot和C ++实时绘制图表。 有人知道任何能做到这一点的好库吗? 谢谢

5个回答

5
gnuplot支持通过管道输入(在Windows上,有一个单独的可执行文件pgnuplot)。然后,您的程序可以向gnuplot发送新命令,例如replot,就像您直接在gnuplot界面中键入它们一样。
如何设置管道连接并从C ++程序写入管道的发送端因操作系统而异,因此如果您需要更多帮助,您必须告诉我们您正在使用什么操作系统。
在Windows上,有CreatePipe,然后您设置传递给CreateProcessSTARTUPINFO结构体的hStdInput元素。如果您需要来自pgnuplot的状态消息,则同样适用于hStdOutput
在 POSIX(Unix、Linux、Mac OSX等)上,您可以使用 popen 作为快速获取单向连接的方法。对于双向连接,它的工作方式更像是在 Windows 上:使用 pipe 获取端点的句柄,然后在子进程中调用 dup2 将 stdin 和 stdout 关联到管道,然后使用 execgnuplot 替换子进程,并保留您设置的管道。

编辑:来自 gnuplot 文档

特殊的文件名'-'指定数据为内联,即它们跟随命令。只有数据跟随命令;plot选项,如过滤器、标题和线条样式,保留在plot命令行上。这类似于unix shell脚本中的<<和VMS DCL中的$DECK。数据被输入,就好像它们是从文件中读取的,每个记录一个数据点。第一列开头的字母"e"终止数据输入。using选项可以应用于这些数据-使用它通过函数过滤它们可能是有意义的,但选择列可能没有意义!

我明白了,但是发送单个点的命令是什么?我只知道如何告诉它绘制数据文件或函数。如何逐点绘制,例如x1 y1,x2 y2? - chutsu
@chutsu:我没有提供那些细节,因为你说你已经知道了gnuplot部分。无论如何,我从文档中添加了相关段落。 - Ben Voigt

3

你尝试过ANSI C中的gnuplot接口吗?这是C语言的一个接口,但在同样的链接中也有一些适用于C++的接口。或者你可以尝试使用PlPlot


1
如果您对软实时绘图感兴趣,最好使用硬件加速的图形 API(如 OpenGL),并自己绘制图表。

我真的希望使用gnuplot,因为这是我已经了解的内容,我已经看到过使用perl将实时数据流传输到gnuplot的各种接口,但由于这是我的大学课程作业,课程导师非常希望我使用C++来完成。 - chutsu
1
请定义您对“实时”的理解。如果它意味着“每秒25次更新”,那么gnuplot可能不适合您。 - etarion
每秒绘制一个图形对我来说已经足够了。 - chutsu

1

还可以在Mac OS的HomeBrew中使用 - brew install feedgnuplot - Xofo

0
在我的 C++ 代码中,这个(在 Mac OsX Mavericks 上,使用 g++ Apple LLVM 版本 5.0)是有效的:
#include <sys/types.h>
#include <unistd.h>

...

// ready to make a plot

pid_t childpid=fork();
if(childpid==0) {
  // child process makes plot
  std::FILE* pipehandle=popen("gnuplot -persist","w");
  // make some plot. You can send multiple commands to the pipe each ending in \n
  std::fprintf(pipehandle,"plot \"results.txt\" using 1:2 with lines\n");
  std::fprintf(pipehandle,"quit\n");
  std::fflush(pipehandle);
  std::fclose(pipehandle);
  // child process exits
  exit(0);
}
// parent process waits for child process to exit
waitpid(childpid,NULL,0);

// you can now repeat to make other gnuplots; all will appear simultaneously in the 
// terminal and are persistent after the parent process has finished.

这应该是可能的,而无需打开外部的gnuplot应用程序 - 你知道如何在Windows上做到这一点吗?我知道在Ubuntu上可以通过fx.sigpack来完成。 - serup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接