Gnuplot - 保存输出

时间:2014-12-16 01:05:44

标签: c++ png gnuplot gif

我使用linux,C ++。我想保存gnuplot的输出。我怎么能用c ++做呢?我试过下面的代码。它生成一个png文件。但它没有绘制点。我想做两个任务

  • 在运行时显示图表
  • 程序完成后将图形保存为gif。

我该怎么做?

FILE *pipe = popen("gnuplot -persist", "w");

// set axis ranges
fprintf(pipe,"set xrange [0:11]\n");
fprintf(pipe,"set yrange [0:]\n");

fprintf(pipe, "set terminal png\n");
fprintf(pipe, "set output 'b.png'\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<5;a++) // 10 plots
{
    x[a] = a;
    y[a] = 2*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
}

1 个答案:

答案 0 :(得分:1)

似乎你的问题不是C-Code本身(或控制gnuplot那样),因为它完美无缺。您可以生成图像,如果省略set terminalset output命令,则(至少我)会在场景上显示一个gnuplot窗口。

然而,目前还不完全清楚你想要绘制的内容。 从您的代码中,您似乎希望每次生成新的xy对时都更新绘图。在这种情况下,请注意几个后续绘图命令的不同终端的不同行为:

  • PNG:文件在第一个图后关闭(如你所说,它只显示一个点!)
  • PDF(pdfcairo):多页PDF,每页有一个图
  • 带选项animate的GIF:动画GIF,每帧一幅。
  • 窗口(x11,wxt,...):每个绘图命令一个接一个地处理,只有最后一个仍然可见(你可能已经看到其他人之前在屏幕上闪烁)

如果这是您想要的,您可以先将所有内容绘制到屏幕上(如上所述,没有set terminalset output),最后将最后一个绘图转储到文件中:

plot sin(x) title 'a curve'          # opens a window on screen and shows curve

set term 'pngcairo'
set output 'b.png'
replot                # redo the last plot command
unset output          # clean closing of file

但是如果你想将几个数据集绘制成一个图,你需要一个plot命令:

plot '-' title 'first plot', '-' title 'second plot'
input data ('e' ends) > 1 2
input data ('e' ends) > 2 3
input data ('e' ends) > 5 6
input data ('e' ends) > e
input data ('e' ends) > 7 8
input data ('e' ends) > 9 10        
input data ('e' ends) > 11 12
input data ('e' ends) > e


set terminal pngcairo
set output 'b.png'
replot
unset output