在 gnuplot 中绘制第 n 行的平均值
plot average of n'th rows in gnuplot
我有一些数据想用 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 个值 value.So 如何绘制平均值和置信度条(区间)??
感谢帮助
在这种情况下,您可以轻松绘制平均值:
plot "myfile.dat" using ():( + + )/3
如果你只想要第二列和第四列的平均值,你可以写(+)/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 的同一目录中(否则,需要修改 gawk
的 -f
选项中的路径. 脚本 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 = ;
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
的每个不同值打印此平均值以及 min/max 值。
在 Gnuplot 脚本中,随后将感兴趣的列传递给 plotCmd
函数,该函数准备要执行的命令,其输出将使用 u 1:2:3:4 w yerrorbars
绘制。此语法意味着置信区间存储在第 3/4 列中,而值本身(平均值)位于第二列中。
上面的两个脚本总共生成了下图。最后一点的置信区间不可见,因为您问题中的示例数据仅包含一条 x=40 的记录,因此 min/max 值与平均值一致。
我有一些数据想用 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 个值 value.So 如何绘制平均值和置信度条(区间)??
感谢帮助
在这种情况下,您可以轻松绘制平均值:
plot "myfile.dat" using ():( + + )/3
如果你只想要第二列和第四列的平均值,你可以写(+)/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 的同一目录中(否则,需要修改 gawk
的 -f
选项中的路径. 脚本 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 = ;
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
的每个不同值打印此平均值以及 min/max 值。
在 Gnuplot 脚本中,随后将感兴趣的列传递给 plotCmd
函数,该函数准备要执行的命令,其输出将使用 u 1:2:3:4 w yerrorbars
绘制。此语法意味着置信区间存储在第 3/4 列中,而值本身(平均值)位于第二列中。
上面的两个脚本总共生成了下图。最后一点的置信区间不可见,因为您问题中的示例数据仅包含一条 x=40 的记录,因此 min/max 值与平均值一致。