2017-03-08 127 views
1

我有一些數據,我想用gnuplot來繪製它們。但我有相同的x值很多y值,我會告訴你準確理解:在gnuplot中的第n行的圖平均值

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 

在這個例子中,我會爲每個6 x值value.So我怎麼可以得出平均值和信心酒吧(區間)??

感謝您的幫助

+0

是Y1/Y2/Y3,分別爲2/3/4你的意思是第一列是X,列?你想平均屬於x = 0的6個y1值?或者你想平均y1/y2/y3?那麼置信區間呢,數據文件中已經存在的值還是必須計算?如果必須計算,如何? – maij

+0

@maij是的,我必須繪製3個圖表(沒有問題)。對於六個值(即y1),我計算平均值,我將表示它,對於置信欄,我確定每組的上限值和下限值。 – wolfgunner

回答

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 = $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的一條記錄,因此最後一點的置信區間不可見,因此最小/最大值與平均值一致。

enter image description here

0

您可以輕鬆地繪製平均在這種情況下:如果你想例如,僅第二和第四列的平均

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

,你可以寫($2+$4)/2等。

+0

我想要的是我代表每6行(值)的平均值,因爲我會畫3張圖(y1 y2 y3)。之後,我提取每組的最小值,最大值。 – wolfgunner