我有这样的数据:
label-> 1 2 3 4 5
val1 1.67E+07 2.20E+07 3.04E+07 7.89E+07 1.24E+08
val2 1.71E+07 2.35E+07 2.70E+07 7.80E+07 1.31E+08
val3 1.48E+07 2.15E+07 2.74E+07 7.18E+07 1.17E+08
val4 1.57E+07 2.07E+07 2.49E+07 7.46E+07 1.27E+08
val5 1.32E+07 2.23E+07 3.07E+07 7.50E+07 1.16E+08
我需要绘制标签与每个val列的平均值,如下所示:
label-> 1 2 3 4 5
val1 1.67E+07 2.20E+07 3.04E+07 7.89E+07 1.24E+08
val2 1.71E+07 2.35E+07 2.70E+07 7.80E+07 1.31E+08
val3 1.48E+07 2.15E+07 2.74E+07 7.18E+07 1.17E+08
val4 1.57E+07 2.07E+07 2.49E+07 7.46E+07 1.27E+08
val5 1.32E+07 2.23E+07 3.07E+07 7.50E+07 1.16E+08
mean 1.55E+07 2.20E+07 2.81E+07 7.57E+07 1.23E+08
是否有可能在gnuplot中执行此操作,还是应该继续附加到Excel?
答案 0 :(得分:0)
您可以使用awk
和gnuplot
来完成此操作。假设您的示例数据(没有mean
行)位于data.txt
中。
然后,您可以从第二列(从i=2
开始)和第二行(记录,或行,#1 - NR==1
- >开始计算每列中的平均值,但不要汇总,而是填写带有零的辅助数组a
:a[i]=0.0
)。为此,可以使用awk
条件:if (NR==1)... else {...calculate the means...}
。
Awk
逐行读取数据。在每一行中,您遍历字段并将数字i
的列中的数据汇总到数组元素a[i]
中:
{for(i=2;i<=NF;i++) a[i]+=$i;}
当迭代第一行(NR==1
)时,我们会;
在END
awk
脚本(已处理的所有行)上,只需按数据NF-1
中的列数除以计算平均值。请注意,下面的代码假设您有矩形格式的数据(NF
= const)。
另外,将行列标签保存到label
数组中:
if (NR==1) {for(i=2;i<=NF;i++) label[i]=$i; ... }
然后将标签和平均值打印到行中,一行打印一个标签。
for(i=2;i<=NF;i++) {printf label[i]" "; print a[i]/(NF-1)}
最终数据表看起来就是这样:
1 15500000
2 22000000
3 28080000
4 75660000
5 123000000
然后你可以将一列与另一列相对照。 注意,gnuplot的最终数据应该按列而不是行格式化。 以下代码执行所描述的操作:
gnuplot> unset key
gnuplot> plot "<export LC_NUMERIC=C; awk '{if (NR==1) {for(i=2;i<=NF;i++) label[i]=$i; a[i]=0.0;} else {for(i=2;i<=NF;i++) a[i]+=$i;};} END {for(i=2;i<=NF;i++) {printf label[i]\" \"; print a[i]/(NF-1)}};' data.txt"
请注意,空格应使用\
中的反斜杠字符gnuplot
进行转义。