Gnuplot – 每秒钟更新图表

我想绘制一个每秒更改的图表。 我使用下面的代码,它周期性地改变graphics。 但是每次迭代都不会保留以前的迭代点。 我该怎么做? 每秒只有一个点。 但是我想用历史数据绘制图表。

FILE *pipe = popen("gnuplot -persist", "w"); // set axis ranges fprintf(pipe,"set xrange [0:11]\n"); fprintf(pipe,"set yrange [0:11]\n"); int b = 5;int a; for (a=0;a<11;a++) // 10 plots { fprintf(pipe,"plot '-' using 1:2 \n"); // so I want the first column to be x values, second column to be y // 1 datapoints per plot fprintf(pipe, "%d %d \n",a,b); // passing x,y data pairs one at a time to gnuplot fprintf(pipe,"e \n"); // finally, e fflush(pipe); // flush the pipe to update the plot usleep(1000000);// wait a second before updating again } // close the pipe fclose(pipe); 

几点意见:

  1. gnuplot中的默认值是x数据来自第一列,y数据来自第二列。 您不需要using 1:2规格。
  2. 如果你想要10张图, for循环的格式应该是for (a = 0; a < 10; a++)

在gnuplot中没有一个好的方法来添加到已经存在的行,所以将你的值存储在一个数组中并将其循环到数组中可能是有意义的:

 #include <vector> FILE *pipe = popen("gnuplot -persist", "w"); // set axis ranges fprintf(pipe,"set xrange [0:11]\n"); fprintf(pipe,"set yrange [0:11]\n"); int b = 5;int a; // to make 10 points std::vector<int> x (10, 0.0); // x values std::vector<int> y (10, 0.0); // y values for (a=0;a<10;a++) // 10 plots { x[a] = a; y[a] = // some function of a fprintf(pipe,"plot '-'\n"); // 1 additional data point per plot for (int ii = 0; ii <= a; ii++) { fprintf(pipe, "%d %d\n", x[ii], y[ii]) // plot `a` points } fprintf(pipe,"e\n"); // finally, e fflush(pipe); // flush the pipe to update the plot usleep(1000000);// wait a second before updating again } // close the pipe fclose(pipe); 

当然,你可能想要避免硬编码的幻数(例如10),但这只是一个例子。