使用gnuplot访问数据文件中的第n个数据点

时间:2012-12-21 08:24:36

标签: gnuplot

在gnuplot中搜索所有管道和内置函数之后,我仍然没有找到一种简单的方法来访问我的数据文件的第n个元素(不是通过增量,单个值)用作函数中的常量(或者for循环中的参数)我的情节。例如,我有一个带有两列的单调递减数据文件,我想在绘制时对y值进行归一化,因此y的范围从一(1)到零(0),减去每个数据点的最后一个值,并将减法除以差值在第一个数据点和最后一个数据点之间。我试过awk,但我对语法不太熟悉。如果有一种简单的方法,我很想知道。

例如

使用1 :(($ 2-'lastdatapoint')/('firstdatapoint' - 'lastdatapoint')绘制“my2columndata.dat”)

或者其中第一个和最后一个数据点同名的东西 - 它们是单调递减数据文件“my2columndata.dat”中的第一个和最后一个数据点

3 个答案:

答案 0 :(得分:2)

这个想法与@andyras相同,但是使用stats

要回答标题,您可以使用every ::n::n,其中n是选择的记录(即数据点)编号。记录从0开始编号,因此如果您想要第一行,则应为every ::0::0。可以在everyplotsplot中使用statseverystats的使用未记录)。我更喜欢stats,因为它没有绘制任何内容,但它会使你的gnuplot控制台变得混乱。此外,您可以使用using进行任意分配。

例如,要保存第一条记录的第二列,

stats "my2columndata.dat" u (firstdatapoint=$2) every ::0::0

现在要获取最后一条记录,您可以使用stats保存的记录数,并将其用作every中的记录编号,

stats "my2columndata.dat" # this saves the number of records to STATS_records
stats "my2columndata.dat" u (lastdatapoint=$2) every ::STATS_records-1::STATS_records-1

现在你可以做你要求的情节了。

<小时/> 在我结束之前,还有一些额外的黑客攻击:

使用mgilson's idea of counting columns,您甚至可以将每列保存为多个变量。 (注意:我对u使用缩写usingev使用every

filename = "yourfilename.dat"
r = 0 # record number
good = 1
col = 1
while (good) {
 stats filename u (good=valid(col)) ev ::r::r
 if (good) {
  stats filename u col ev ::r::r
  eval(sprintf("v%d=STATS_max",col))
  col = col+1
 }
}

如果数据文件包含8列,则现在定义了v1v8

但我认为使用外部工具是正确的方法(UNIX喜欢可以使用tail / head等)。让我们责备gnuplot作者让这成为可能:)

答案 1 :(得分:1)

在你的情况下(因为你知道数据文件是单调减少的),这不是很难做到。

set terminal unknown
plot 'my2columndata.dat' # gather basic statistics
first=GPVAL_DATA_Y_MAX
last=GPVAL_DATA_Y_MIN

set terminal <whatever>
set output <whatever.wht>
plot 'my2columndata.dat' u 1:(($2-last)/(first-last))

此方法收集有关数据文件的信息而不创建输出,然后使用GPVAL变量重新映射。 (在使用命令show variables all绘图后,您可以在gnuplot中看到这一点。)在gnuplot 4.6.0及更高版本中,您可以使用stats命令收集数据,而不像我在此处所做的那样绘图; stats创建了不同的变量名称。

访问第n个数据点(如你的问题标题所示)将会更加棘手。

答案 2 :(得分:0)

尽管问题很老,但是在某些情况下,仍然有必要获取某个列的第一个,第n个或最后一个值。我知道,Linux用户可能会使用awk或其他外部程序,但以下是与平台无关的 gnuplot-only 解决方案。

此解决方案与@andyras和@syockit的现有答案的区别:

  • 也可用于非单调减少的数据
  • 不需要stats
  • 还可以处理具有多个空行的数据(@syockit的解决方案可能会给出错误的结果)
  • 还返回第n个数据点。

还可以使用gnuplot 4.6.0(OP提出问题的时间)。

数据:"Data.dat"

# some comments
 0.1  0.2
 1.1  1.2
 2.1  2.2

 4.1  4.2
 5.1  5.2

 7.1  7.2


10.1 10.2
11.1 11.2

13.1 13.2
14.1 14.2


17.1 17.2

19.1 19.2
20.1 20.2

22.1 22.2

24.1 24.2
25.1 25.2

代码:

### get fist, nth and last datapoint of a column
reset

PointFirst = NaN
PointNth = NaN
PointLast = NaN
N=8

set terminal unknown
n=0
plot "Data.dat" u (n=n+1, n==1?PointFirst=$2:NaN, N==n?PointNth=$2:PointLast=$2)

print sprintf("First point:  %g",PointFirst)
print sprintf("% 2dth point:  %g",N,PointNth)
print sprintf("Last point:  %g",PointLast)
### end of code

结果:

First point:  0.2
 8th point:  11.2
Last point:  25.2