gnuplot中的平均数据范围和图

时间:2015-08-07 12:43:03

标签: range gnuplot average rows calculated-columns

我有这样的数据:

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?

1 个答案:

答案 0 :(得分:0)

您可以使用awkgnuplot来完成此操作。假设您的示例数据(没有mean行)位于data.txt中。 然后,您可以从第二列(从i=2开始)和第二行(记录,或行,#1 - NR==1 - >开始计算每列中的平均值,但不要汇总,而是填写带有零的辅助数组aa[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进行转义。