平均列的值

时间:2015-04-09 11:50:17

标签: gnuplot average

我对这个论坛很陌生。

我的gnuplot脚本有问题。我希望程序从一个文件中读取并获取一列中的数据的平均值,但只有两个后续行。

这是我的数据文件的一个示例:

10972710;0;97;11699;75114829;14017;62910343;4294966568;71227698;4294690030;17218646
10972710;1;98;4294694062;75242152;4294781521;62921071;4294614770;71144038;4294733461;18276743
10972710;0;99;117245;75164467;4294946663;62862643;49062;71038638;4294745782;17886802
10972710;1;100;4294799584;75123654;4294686842;63040946;4294609337;71224369;4294706709;17333245
10972710;0;101;1845;75045355;46741;62966683;72313;71243339;4294713057;18914555
10972809;1;102;4294963298;75210462;59798;63318000;4587;71262619;70880;19513152
10972809;0;103;4294957708;75074862;33562;63074526;189991;71061923;39240;18642066

例如,关注第4列我想要执行第2行的平均值,第2行,第3行和第4列,依此类推。在gnuplot中是否有一些内置函数,还是我必须自己编写?

非常感谢你。

Tommaso

1 个答案:

答案 0 :(得分:1)

使用gnuplot可以对相邻行进行一些简单的操作:必须使用using语句中的赋值保存一行的值,并且每隔一个点只保存一次:

set datafile separator ';'
prev = curr = 0
plot 'test.txt' using (int($0)/2):(prev = curr, curr = $4, int($0)%2 == 1 ? (curr - prev)/2.0 : 1/0) with linespoints

using语句的工作方式如下,首先将上一行的值(在此时仍在curr中)分配给变量prev,然后指定当前值如果你在一个奇数行号(行从0开始),或者用curr给出一个无效点,则行到1/0并最终取平均值。

5.0版的结果是

enter image description here

如您所见,虽然我指定了linespoints,但您只获得了积分。无效1/0使gnuplot中断这里的行,因此不会绘制任何行。

使用gnuplot 5.0,您可以将过滤结果保存到临时文件(或者也可以保存到heredoc结构$avg),并通过第二次调用绘制处理过的数据:

set datafile separator ';'

prev = curr = 0

set table $avg
plot 'test.txt' using (int($0)/2):(prev = curr, curr = $4, int($0)%2 == 1 ? (curr - prev)/2.0 : 1/0) with lp pt 7
unset table

set datafile separator whitespace
plot $avg using 1:2 w lp

请注意,这不适用于版本4.6,因为此版本对解析内部带有NaN的数据文件的处理方式不同,就像gnuplot生成的那样。

最后,您还可以使用awk等外部工具为您进行处理,例如

plot '< awk -F";" "{if (NR%2 == 0) { printf \"%.10e\n\", (\$4-prev)/2.0 }; prev = \$4}" test.txt' using 0:1 with linespoints