我在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);
如果运行示例代码,结果如下:
如我们所见,合并成功,但是该行被省略,并出现以下错误:
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的部分(不进行分箱),则会得到此图:
因此,问题可能出在这两个图的兼容性上。
答案 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);