17

我编写了一个程序,它将数据列表写入“.dat”文件,然后使用 gnuplot 单独绘制它。有没有办法让我的代码自动绘制它?我的输出形式为:

x-coord    analytic    approximation
x-coord    analytic    approximation
x-coord    analytic    approximation
x-coord    analytic    approximation
x-coord    analytic    approximation
 ....

理想情况下,当我运行代码时,图形也会打印一个 x-label、y-label 和标题(可以从我的 C 代码中更改)。非常感谢。

4

5 回答 5

46

我在寻找有关 gnuplot 的其他内容时遇到了这个问题。尽管这是一个老问题,但我想我会贡献一些示例代码。我将它用于我的一个程序,我认为它做得非常好。AFAIK,此 PIPEing 仅适用于 Unix 系统(请参阅下面的 Windows 用户编辑)。我的 gnuplot 安装是来自 Ubuntu 存储库的默认安装。

#include <stdlib.h>
#include <stdio.h>
#define NUM_POINTS 5
#define NUM_COMMANDS 2

int main()
{
    char * commandsForGnuplot[] = {"set title \"TITLEEEEE\"", "plot 'data.temp'"};
    double xvals[NUM_POINTS] = {1.0, 2.0, 3.0, 4.0, 5.0};
    double yvals[NUM_POINTS] = {5.0 ,3.0, 1.0, 3.0, 5.0};
    FILE * temp = fopen("data.temp", "w");
    /*Opens an interface that one can use to send commands as if they were typing into the
     *     gnuplot command line.  "The -persistent" keeps the plot open even after your
     *     C program terminates.
     */
    FILE * gnuplotPipe = popen ("gnuplot -persistent", "w");
    int i;
    for (i=0; i < NUM_POINTS; i++)
    {
    fprintf(temp, "%lf %lf \n", xvals[i], yvals[i]); //Write the data to a temporary file
    }

    for (i=0; i < NUM_COMMANDS; i++)
    {
    fprintf(gnuplotPipe, "%s \n", commandsForGnuplot[i]); //Send commands to gnuplot one by one.
    }
    return 0;
}

编辑

在我的应用程序中,我还遇到了在调用程序关闭之前绘图不会出现的问题。要解决这个问题,fflush(gnuplotPipe)请在您使用fprintf它发送您的最终命令之后添加一个。

我还看到 Windows 用户可以使用_popen-popen但是我无法确认这一点,因为我没有安装 Windows。

编辑 2

plot '-'可以通过向 gnuplot 发送命令,然后是数据点,然后是字母“e” 来避免写入文件。

例如

fprintf(gnuplotPipe, "plot '-' \n");
int i;

for (int i = 0; i < NUM_POINTS; i++)
{
  fprintf(gnuplotPipe, "%lf %lf\n", xvals[i], yvals[i]);
}

fprintf(gnuplotPipe, "e");
于 2011-08-03T23:05:29.187 回答
6

您可以创建一个 gnuplot 脚本并生成一个运行 gnuplot 的进程以从命令行绘制此脚本,或者您可以使用提供的接口之一。对于 C,这里有一个来自 Nicolas Devillard 的基于 POSIX 管道的接口:http://ndevilla.free.fr/gnuplot/ ... 并且可以通过 git 获得基于 iostream 的 C++ 版本(参见:http:// www.stahlke.org/dan/gnuplot-iostream/

不过,最便携也可能是最简单的方法仍然是调用 gnuplot 来绘制脚本。正如 sje397 提到的,检查您的文档以了解 stdlib.h 中的 system() 调用。

在旁注中,还有 GNU plotutils,它提供了 libplot,一个用于绘制数据集的库,您可以在应用程序中使用它。见:http ://www.gnu.org/software/plotutils/

于 2010-08-19T11:48:58.957 回答
3

虽然我见过很多这样做的方法,但最简单的方法是使用 C 中的 system()(来自 stdlib.h)函数。首先制作一个 gnuplot 脚本并将其保存为“name.h”。 gp”(无论是名称还是扩展名都无关紧要)。
一个简单的脚本是,

plot 'Output.dat' with lines

保存此脚本文件后,只需
system("gnuplot -p name.gp");
在代码末尾添加即可。
就这么简单。

确保将 gnuplot 路径添加到 Windows 系统路径变量。

于 2015-09-03T14:59:38.043 回答
1

我已经调整了接受的答案来绘制一个浮点数组,同时避免使用临时文件。其中,float* data_是数组size_t size_及其大小。希望它对某人有帮助!

干杯,
安德烈斯

void plot(const char* name="FloatSignal"){
  // open persistent gnuplot window
  FILE* gnuplot_pipe = popen ("gnuplot -persistent", "w");
  // basic settings
  fprintf(gnuplot_pipe, "set title '%s'\n", name);
  // fill it with data
  fprintf(gnuplot_pipe, "plot '-'\n");
  for(size_t i=0; i<size_; ++i){
    fprintf(gnuplot_pipe, "%zu %f\n", i, data_[i]);
  }
  fprintf(gnuplot_pipe, "e\n");
  // refresh can probably be omitted
  fprintf(gnuplot_pipe, "refresh\n");
}
于 2017-12-06T06:58:26.887 回答
1

我知道为时已晚,但回答是否可以帮助某人。fputs 确实可以完成工作,您想要。首先,您需要在临时文件 data.temp 中打印要绘制的数据。

FILE *pipe_gp = popen("gnuplot -p", "w");
fputs("set terminal png \n",pipe_gp);
fputs("set output 'abc.png' \n",pipe_gp);
fputs("set xlabel 'f' \n",pipe_gp);
fputs("set xrange [0:100] \n",pipe_gp);
fputs("set yrange [0:100] \n",pipe_gp);
fputs("plot 'data.temp' u 1:2 w circles lc rgb 'pink' notitle \n",pipe_gp);
pclose(pipe_gp);
于 2020-10-08T06:07:35.327 回答