Gnuplot - 每秒更新一次图表

时间:2014-12-07 12:57:21

标签: c++ linux pipe 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 个答案:

答案 0 :(得分:1)

一些评论:

  1. gnuplot中的默认值是x数据来自第一列,y数据来自第二列。您不需要using 1:2规范。
  2. 如果你想要10个图,for循环的形式应为for (a = 0; a < 10; a++)
  3. 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),但这只是一个例子。