2014-12-07 114 views
3

我想绘制每秒更改的图形。我使用下面的代码,它会定期更改图形。但是每次迭代都不会保留先前的迭代点。我该怎么做? 每秒只有一分。但我想用历史数据绘制图表。Gnuplot - 每秒更新图形

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

几点意见:

  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),但这只是一个例子。

+0

谢谢!此代码是工作。但是这个解决方案不是基于gnuplot。我试图找到一个基于gnuplot命令的解决方案。如果我找不到它,我使用此代码。非常感谢你。 – zumma 2014-12-07 13:51:18