1

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

例如

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

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

4

3 回答 3

2

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

要回答标题,您可以使用every ::n::n,其中 n 是选择的记录(即数据点)编号。记录从 0 开始编号,所以如果你想要第一行,它应该是every ::0::0. every可用于plot, splot, 或statseveryinstats的用法未记录)。我更喜欢stats它,因为它不绘制任何东西,但它确实使您的 gnuplot 控制台混乱(编辑以避免nooutput在命令末尾使用混乱的控制台stats)。此外,您可以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 的计数列的想法,您甚至可以将每一列保存到多个变量中。(注意:我使用和ufor的简写)usingevevery

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 列,那么现在定义v1了 to 。v8

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

于 2013-07-02T02:38:02.160 回答
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 变量重新绘制。(您可以在使用命令绘图后在 gnuplot 中看到这一点show variables all。)在 gnuplot 4.6.0 及更高版本中,您可以使用stats命令来收集数据而无需像我在这里所做的那样绘图;stats虽然创建不同的变量名。

访问第 n 个数据点(正如您的问题标题所暗示的那样)会比较棘手。

于 2012-12-21T16:22:05.253 回答
0

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

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

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

也适用于 gnuplot 4.6.0(OPs 问题的时间)。

数据: ( "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
于 2020-03-10T14:29:13.850 回答