我有一个带有制表符分隔列的数据文件,如下所示:
6 27 4 12 20 100 50000 false 0.1 "DFSA" 2 201414 31.47408
3 27 4 12 20 100 50000 false 0.1 "DFSA" 2 204236 31.91436
4 27 4 12 20 100 50000 false 0.1 "DFSA" 2 206964 32.09382
8 27 4 12 20 100 50000 false 0.1 "DFSA" 2 203379 31.88138
1 27 4 12 20 100 50000 false 0.1 "DFSA" 2 207287 32.4096
2 27 4 12 20 100 50000 false 0.1 "DFSA" 2 207115 32.61346
7 27 4 12 20 100 50000 false 0.1 "DFSA" 2 207751 32.77364
5 27 4 12 20 100 50000 false 0.1 "DFSA" 2 209856 32.77856
13 27 4 12 20 100 50000 false 0.1 "DFSA" 2 204257 32.08478
10 27 4 12 20 100 50000 false 0.1 "DFSA" 2 207335 32.22742
9 27 4 12 20 100 50000 false 0.1 "DFSA" 2 200518 31.64624
11 27 4 12 20 100 50000 false 0.1 "DFSA" 2 202415 32.0591
16 27 4 12 20 100 50000 false 0.1 "DFSA" 2 201548 31.59604
12 27 4 12 20 100 50000 false 0.1 "DFSA" 2 213840 33.27478
15 27 4 12 20 100 50000 false 0.1 "DFSA" 2 208926 32.37782
14 27 4 12 20 100 50000 false 0.1 "DFSA" 2 210572 32.81294
17 27 4 12 20 100 50000 false 0.1 "DFSA" 2 204724 32.26324
20 27 4 12 20 100 50000 false 0.1 "DFSA" 2 199169 31.53494
18 27 4 12 20 100 50000 false 0.1 "DFSA" 2 208179 32.73408
19 27 4 12 20 100 50000 false 0.1 "DFSA" 2 204342 31.82608
21 27 4 12 20 100 50000 false 0.1 "DFSA" 2 205068 31.986
24 27 4 12 20 100 50000 false 0.1 "DFSA" 2 207798 32.49448
22 27 4 12 20 100 50000 false 0.1 "DFSA" 2 207499 32.60746
23 27 4 12 20 100 50000 false 0.1 "DFSA" 2 214065 33.17844
25 27 4 12 20 100 50000 false 0.1 "DFSA" 2 198386 31.4488
26 27 4 12 20 100 50000 false 0.1 "DFSA" 2 208307 32.77412
28 27 4 12 20 100 50000 false 0.1 "DFSA" 2 208669 32.77474
27 27 4 12 20 100 50000 false 0.1 "DFSA" 2 214324 33.16506
30 27 4 12 20 100 50000 false 0.1 "DFSA" 2 209924 32.77186
29 27 4 12 20 100 50000 false 0.1 "DFSA" 2 212959 33.3218
32 27 4 12 20 100 50000 false 0.2 "DFSA" 2 486241 64.3479
31 27 4 12 20 100 50000 false 0.2 "DFSA" 2 487487 64.65076
33 27 4 12 20 100 50000 false 0.2 "DFSA" 2 494703 65.06718
34 27 4 12 20 100 50000 false 0.2 "DFSA" 2 488164 64.77828
36 27 4 12 20 100 50000 false 0.2 "DFSA" 2 476513 63.3158
35 27 4 12 20 100 50000 false 0.2 "DFSA" 2 491005 65.02426
38 27 4 12 20 100 50000 false 0.2 "DFSA" 2 487454 64.44962
37 27 4 12 20 100 50000 false 0.2 "DFSA" 2 490494 65.06572
39 27 4 12 20 100 50000 false 0.2 "DFSA" 2 472081 63.31234
40 27 4 12 20 100 50000 false 0.2 "DFSA" 2 498294 65.02114
数据继续向下增长第9列中的值(30行,值为0.1,30行,值为0.2,另外30行,0.3,依此类推)。
我想在Gnuplot中为{30}中的每一行绘制具有相同值的第9列的平均值第13列with yerrorlines
。为了绘制图,我应该通过Gnuplot column 9 value
,{{1}在30行中,以及置信区间的最小值和最大值(例如95%)。在0.1的情况下,传递给Gnuplot的行应如下所示:
mean of column 13
假设95%置信区间为+0.25且平均值为36.08附近+0.25
感谢您的帮助 此致
答案 0 :(得分:3)
awk 'BEGIN{sum=0;pat=0;cnt=0}{if(pat==$9) {sum=sum+$13;cnt++} else {if (cnt!=0) {printf "%s %2.2f %2.2f %2.2f\n" ,pat,(sum/cnt)*0.95,sum/cnt,sum/cnt*1.05} pat=$9;sum=0;cnt=0} }END{printf "%s %2.2f %2.2f %2.2f\n" ,pat,(sum/cnt)*0.95,sum/cnt,sum/cnt*1.05}' data_table.txt
ARGS:
1.pat
- 第9栏中的数字
2.sum
- 包含pat相同的所有行的第13列的总和
3.cnt
- 包含pat为红色的时间
BEGIN{sum=0;pat=0;cnt=0}
- 设置所有变量if(pat==$9)
- 检查模式是否相同
如果它是相同的形式平均值和增量ctn else
- 如果cnt!=0
(pat line总和为平均值)将所需值打印到屏幕printf "%s %2.2f %2.2f %2.2f\n" ,pat,(sum/cnt)*0.95,sum/cnt,sum/cnt*1.05
%2.2f
得到浮点00.00结构END
打印最后一次拍摄的意思 0.1 30.77 32.39 34.01
0.2 61.29 64.52 67.75
答案 1 :(得分:2)
我想完成@shaikisiegal上面的脚本,添加公式以使用t-student pdf计算置信区间。
awk '
BEGIN {sum=0;pat=0;cnt=0;summ=0}{
if(pat==$9) {sum=sum+$13; arr[cnt]=$13; cnt++} else {
if (cnt!=0) {
for (i=1;i<=cnt;i++) {
summ+=(arr[i]-(sum/cnt))^2
}
printf "%s %2.2f %2.2f %2.2f\n" ,pat, sum/cnt, (sum/cnt)-2.045*sqrt(summ/(cnt-1))/sqrt(cnt), (sum/cnt)+2.045*sqrt(summ/(cnt-1))/sqrt(cnt)
}
pat=$9;sum=0;cnt=0;summ=0
}
}
END {
for (i=1;i<=cnt;i++) {
summ+=(arr[i]-(sum/cnt))^2
}
printf "%s %2.2f %2.2f %2.2f\n" ,pat, sum/cnt, (sum/cnt)-2.045*sqrt(summ/(cnt-1))/sqrt(cnt), (sum/cnt)+2.045*sqrt(summ/(cnt-1))/sqrt(cnt)
}
' data_table.txt
其中2.045
是t-student pdf分布表的95%和30个数据样本的表格值。
答案 2 :(得分:2)
我知道问题的标签为awk
,但自提及gnuplot
以来,我是否可以建议使用仅限gnuplot的解决方案?
Gnuplot有一个smooth unique
函数可以查找唯一值(在您的情况下是第9列)并执行y值的简单平均值(在您的情况下是第13列)。你可以直接绘制这个,但如果有一些额外的线条可以让你的输出更好。
使用问题中的输入文件和以下代码:
set term png
set out "test.png"
set table "tab.tmp"
plot "data.txt" u 9:13 smooth unique
unset table
set xrange[0.09:0.21]
set yrange[25:75]
set style fill transparent solid 0.2 noborder
set key top left
set multiplot layout 2,1
plot "tab.tmp" u 1:(strcol(3) eq "u" ? 1/0: $2*0.95):($2*1.05)
with filledcurves title '95% confidence', \
"tab.tmp" u 1:(strcol(3) eq "u" ? 1/0: $2)
with lp lt 1 pt 7 ps 1.0 lw 3 title 'mean value'
plot "tab.tmp" u 1:(strcol(3) eq "u" ? 1/0: $2):($2*0.95):($2*1.05) \
with yerrorlines lt 1 pt 7 ps 1.0 lw 3 title 'value+confidence'
set table
部分创建一个包含唯一值及其平均值的新表:
# Curve 0 of 1, 3 points
# Curve title: ""tmp" u 9:13"
# x y type
0.1 32.3633 i
0.2 64.5033 i
0.1 32.0938 u
然后,您可以将此文件视为常规数据文件,并根据需要进行绘图。唯一的技巧来自:(strcol(3) eq "u" ? 1/0: $2)
。这是一个简单的条件告诉gnuplot忽略第3列是&#34; u&#34; (不确定)。然后,您可以根据需要直接计算置信区间。
无论如何,希望它有所帮助!