2014-12-07 98 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