我对这个论坛很陌生。
我的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
答案 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版的结果是
如您所见,虽然我指定了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