我正在尝试使用GNUplot和C ++实时绘制图表。 有谁知道这样做的任何好的图书馆? 感谢
答案 0 :(得分:4)
gnuplot支持通过管道输入(在Windows上,有一个单独的可执行文件,pgnuplot
)。然后你的程序可以向gnuplot发送新命令,例如replot
,就像你直接在gnuplot接口中输入它们一样。
如何设置管道连接并从C ++程序写入管道的发送端因操作系统而异,因此如果您需要更多帮助,则必须告诉我们您正在使用的是什么。
在Windows上,有CreatePipe
,然后您设置传递给hStdInput
的{{1}}结构的STARTUPINFO
元素。如果您需要来自CreateProcess
的状态消息,则与hStdOutput
同上。
在POSIX(Unix,Linux,Mac OSX等)上,您可以使用pgnuplot
作为获得单向连接的快捷方式。对于双向,它更像是在Windows上运行:popen
来获取目标的句柄,然后是pipe
,并在子进程中调用fork
以将stdin和stdout与管道关联,然后{ {1}}让dup2
替换子进程,保留您设置的管道。
编辑:来自the gnuplot documentation:
特殊文件名' - '指定 数据是内联的;即,他们 按照命令。只有数据 按照命令; 情节等选项 过滤器,标题和线条样式 保留在 plot 命令行中。这个 类似于<<在unix shell脚本中, 和VMS DCL中的$ DECK。数据是 输入好像正在阅读 从一个文件,每个数据点 记录。字母“e”在开头 第一列终止数据 条目。可以应用使用选项 这些数据 - 使用它来过滤 他们通过一个功能可能会 感觉,但可能选择列 不!
答案 1 :(得分:3)
您是否尝试了gnuplot interfaces in ANSI C ?,这是C的接口,但在相同的链接中有一些C ++接口。或者您可以尝试PlPlot。
答案 2 :(得分:1)
如果您对软实时绘图感兴趣,那么您可能最好使用硬件加速图形API(例如OpenGL),并自己绘制图表。
答案 3 :(得分:1)
查看http://search.cpan.org/~dkogan/feedGnuplot-1.08/bin/feedGnuplot这是一个命令行实用程序,但如果从程序控制,也可以正常工作。
答案 4 :(得分: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.