Gnuplot - 每秒更新图形

Gnuplot - Update graph each second

本文关键字:更新 图形 Gnuplot      更新时间:2023-10-16

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

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 %dn", x[ii], y[ii]) // plot `a` points
    }
    fprintf(pipe,"en");    // 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),但这只是一个示例。