我有一些数据想要用 gnuplot 绘制它们。但对于相同的 x 值,我有许多 y 值,我将向您展示如何更好地理解:
0 0.650765 0.122225 0.013325
0 0.522575 0.001447 0.010718
0 0.576791 0.004277 0.104052
0 0.512327 0.002268 0.005430
0 0.530401 0.000000 0.036541
0 0.518333 0.001128 0.017270
20 0.512864 0.001111 0.005433
20 0.510357 0.005312 0.000000
20 0.526809 0.001089 0.033523
20 0.527076 0.000000 0.034215
20 0.507166 0.001131 0.000000
20 0.513868 0.001306 0.004344
40 0.531742 0.003295 0.0365
在这个例子中,每个 x 值有 6 个值。那么如何绘制平均值和置信度条(区间)??
感谢帮助
最佳答案
为此,您将需要某种外部处理。一种可能性是使用 gawk 来计算所需的数量,并将此辅助输出提供给 Gnuplot 来绘制它。例如:
set terminal png enhanced
set output 'test.png'
fName = 'data.dat'
plotCmd(col_num)=sprintf('< gawk -f analyze.awk -v col_num=%d %s', col_num, fName)
set format y '%0.2f'
set xr [-5:25]
plot \
plotCmd(2) u 1:2:3:4 w yerrorbars pt 3 lc rgb 'dark-red' t 'column 2'
这假设脚本 analyze.awk
驻留在启动 Gnuplot 的同一目录中(否则,需要修改 -f
中的路径gawk
的选项。脚本 analyze.awk
本身的内容如下:
function analyze(x, data){
n = 0;mean = 0;
val_min = 0;val_max = 0;
for(val in data){
n += 1;
delta = val - mean;
mean += delta/n;
val_min = (n == 1)?val:((val < val_min)?val:val_min);
val_max = (n == 1)?val:((val > val_max)?val:val_max);
}
if(n > 0){
print x, mean, val_min, val_max;
}
}
{
curr = $1;
yval = $(col_num);
if(NR==1 || prev != curr){
analyze(prev, data);
delete data;
prev = curr;
}
data[yval] = 1;
}
END{
analyze(curr, data);
}
它直接实现了online algorithm计算平均值,并为 x
的每个不同值打印该平均值以及最小/最大值。
在 Gnuplot 脚本中,感兴趣的列随后被传递到 plotCmd
函数,该函数准备要执行的命令,并使用 u 1:2 绘制其输出: 3:4 w yerrorbars
。此语法意味着置信区间存储在第三/第四列中,而值本身(平均值)驻留在第二列中。
总的来说,上面的两个脚本生成了下面的图片。最后一点的置信区间不可见,因为问题中的示例数据仅包含 x=40 的一条记录,因此最小/最大值与平均值一致。
关于graph - 在 gnuplot 中绘制第 n 行的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42677017/