【问题标题】:average the values of a column平均一列的值
【发布时间】:2015-04-10 19:30:37
【问题描述】:

我是这个论坛的新手。

我的 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 列,我想对第 1 行和第 2 行、第 3 行和第 4 行进行平均,依此类推。 gnuplot中是否有一些内置函数或者我必须自己编写?

非常感谢。

托马索

【问题讨论】:

  • 在 gnuplot 中访问两个不同的行并不是那么简单。如果计算第一行和第二行第四列的​​平均值,x 值应该是多少?
  • 目前我使用的是第一列,但实际上我并不关心 x 值。我可以将一个渐进指数放在平均值上并将其用作 x 值。

标签: gnuplot average


【解决方案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,然后将当前行的值分配给@987654326 @ 最后如果你是奇数行号(行从 0 开始)求平均值,或者用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2018-07-12
    相关资源
    最近更新 更多