我有一些数据,我想用gnuplot绘制它们。但我有相同的x值y 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个值。那么我如何绘制平均值和置信度(间隔)??
感谢您的帮助
答案 0 :(得分:2)
为此,您需要进行某种外部处理。一种可能性是使用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
一起绘制。此语法表示置信区间存储在第3 /第4列,而值本身(均值)位于第2列。
总的来说,上面的两个脚本产生了下面的图片。由于问题中的示例数据仅包含一个x = 40的记录,因此最后一个点的置信区间不可见,因此最小值/最大值与均值一致。
答案 1 :(得分:0)
在这种情况下,您可以轻松绘制平均值:
plot "myfile.dat" using ($1):($2 + $3 + $4)/3
例如,如果您只想要第二列和第四列的平均值,则可以编写($2+$4)/2
,依此类推。