Graph n'的绘图平均值;gnuplot中的第th行

Graph n'的绘图平均值;gnuplot中的第th行,graph,gnuplot,average,confidence-interval,Graph,Gnuplot,Average,Confidence Interval,我有一些数据,我想用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

我有一些数据,我想用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个值。那么如何绘制平均值和置信条(区间)


感谢您的帮助

在这种情况下,您可以轻松绘制平均值:

plot "myfile.dat" using ($1):($2 + $3 + $4)/3 

例如,如果只需要第二列和第四列的平均值,可以编写
($2+$4)/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'
它直接实现计算平均值,并为
x
的每个不同值打印该平均值以及最小/最大值

在Gnuplot脚本中,感兴趣的列随后被传递到
plotCmd
函数,该函数准备要执行的命令,其输出将用
u1:2:3:4w yerrorbars
打印。此语法意味着置信区间存储在第3/4列中,而值本身(平均值)位于第二列中

总的来说,上面的两个脚本生成了下面的图片。最后一点的置信区间不可见,因为问题中的示例数据仅包含一条x=40的记录,因此最小/最大值与平均值一致


您的意思是第一列是x,第2/3/4列分别是y1/y2/y3吗?是否要对属于x=0的6个y1值求平均值?或者你想要平均y1/y2/y3?那么置信区间呢?数据文件中是否已经存在这些值,或者必须计算它们?如果必须计算,如何计算?@maij是的,我必须画3张图(这没有问题)。对于六个值(即y1),我计算平均值并表示它,对于置信条,我固定每组的上限值和下限值。我想要的是,我表示每6行(值)的平均值,因为我将绘制3个图(y1 y2 y3)。然后,我提取每个集合的最小值和最大值。
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);
}