在Gnuplot的直方图中叠加一条线

时间:2019-03-25 05:57:38

标签: c++ gnuplot

我在Mac上的Xcode中使用C ++,并使用管道方法与Gnuplot进行通信。在运行它之后,我有兴趣直接通过该程序将数组转换为图形。使用

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

我打开文件,然后使用fprintf进行通信。

现在,我有一些感兴趣的数组中的数据。 w是标准正态变量的“建议”数组,我打算检查它是否确实是均值= 0和方差= 1的高斯分布。为此,我绘制了直方图。之后,我想叠加一个真实的高斯函数,该函数直接在直方图上具有ex作为x坐标值和gauss作为y坐标值。我怎样才能做到这一点?

这是到目前为止的代码:

double start = -4; //min
double end = 4 ; //max
double numberofbins = 100;
double width = (end-start)/numberofbins ;

fprintf (f,
         "set ylabel '# of elements'\n"
         "set xlabel 'The numbers'\n"
         "Min = %g\n" //where binning starts
         "Max = %g\n" // where binning ends
         "n = %g\n" // the number of bins
         "width = 10**(-1)\n" // binwidth;  (Max-Min)/n
         "bin(x) = width*(floor((x-Min)/width)+0.5) + Min\n"
         "f(x)= e**((-x**2)/2) / sqrt(2*pi)\n"
         "plot '-' using (bin($1)):(1) smooth freq with boxes,'' u $2:$3 with lines linestyle 1\n",start,end,numberofbins)

for (int i= 0; i < numberofpoints; i++){
    fprintf(f, "%g %g %g\n", w[i], ex[i], gauss[i]);
}

fclose(f);

如果运行示例代码,结果如下:

output 01

如我们所见,合并成功,但是该行被省略,并出现以下错误:

gnuplot> plot '-' using (bin($1)):(1) smooth freq with boxes,'' u $2:$3 with lines linestyle 1
                                                               ^
     line 100000: column() called from invalid context

我已经在线检查过,但是没有人正在练习与Gnuplot进行通信。

如果仅绘制2:3的部分(不进行分箱),则会得到此图:

output 02

因此,问题可能出在这两个图的兼容性上。

2 个答案:

答案 0 :(得分:2)

有多种方式绘制“内联”数据

plot '-' u 1:2 w lines
1 11
2 22
3 33
e

从gnuplot help special-filenames

  

如果在同一个绘图命令上同时使用'-'和'',则需要   有两组内联数据,...

这意味着:

plot '-' u 1:2 w boxes, '' u 1:2 w lines
1 11
2 22
3 33
e
1 11
2 22
3 33
e

因此,相反,我将在生成的命令字符串的开头生成一个数据块,并在绘图命令期间根据需要多次重复使用数据。

$Data <<EOD
1 11
2 22
3 33
EOD

plot $Data u 1:2 w boxes, '' u 1:2 w lines

答案 1 :(得分:0)

我通过在同一张图上创建第二个y轴并根据它进行绘制来解决了这个问题。使用的代码是:

 fprintf (f,
             "set xlabel 'The numbers'\n"
             "Min = %g\n" //where binning starts
             "Max = %g\n" // where binning ends
             "n = %g\n" // the number of bins
             "width = 10**(-1)\n" // binwidth;  (Max-Min)/n
             "bin(x) = width*(floor((x-Min)/width)+0.5) + Min\n"
             "set ytics 100 nomirror tc lt 1\n"
             "set ylabel '# of elements' tc lt 1\n"
             "set y2tics 0.4 nomirror tc lt 2\n"
             "set y2label 'Theoretical Gaussian' tc lt 2\n"
             "plot '-' using (bin($1)):(1) smooth freq with boxes title 'Generator Histogram','-' u 1:2 with l axes x1y2 title 'Theoretical Gaussian (mean=0, std = 1)'\n",start,end,numberofbins) ;

    for (int i= 0; i < numberofpoints; i++){
        fprintf(f, "%g\n", w[i]);
    } 
    fprintf(f,"e\n");

    for (int i= 0; i < numberofpoints; i++){
        fprintf(f, "%g %g\n",ex[i], gauss[i]);
    }
    fprintf(f,"e\n");
    fclose(f);   

可绘制以下内容: enter image description here