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

使用gnuplot访问数据文件中的第n个数据点,gnuplot,Gnuplot,在搜索了gnuplot中的所有管道和内置函数之后,我仍然没有找到一种简单的方法来访问数据文件的第n个元素(不是通过增量,即单个值),以便在绘图的函数(或for循环中的参数)中用作常量。例如,我有一个具有两列的单调递减数据文件,我想在打印时规范化y值,以便通过从每个数据点减去最后一个值并除以第一个数据点和最后一个数据点之间的差值,y的范围从一(1)到零(0)。我试过awk,但我对语法不太熟悉。如果有一个简单的方法,我想知道 比如说 使用1:($2-'lastdatapoint')/('firstd

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

比如说

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

或者第一个和最后一个数据点是同名的,它们是单调递减数据文件“my2columnda.dat”中的第一个和最后一个数据点。在您的情况下(因为您知道数据文件是单调递减的),这并不难做到

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))
设置终端未知
绘制“my2columndata.dat”#收集基本统计数据
第一个=GPVAL_数据_Y_最大值
最后=GPVAL_数据_Y_最小值
设置终端
设定输出
绘图'my2columndata.dat'u 1:($2-last)/(first-last))
此方法在不创建输出的情况下收集有关数据文件的信息,然后使用GPVAL变量进行replots。(使用命令
show variables all
打印后,您可以在gnuplot中看到这一点)在gnuplot 4.6.0及更高版本中,您可以使用
stats
命令收集数据,而无需像我在这里所做的那样进行打印<代码>统计数据创建不同的变量名称


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

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

要回答标题,可以使用
every::n::n
,其中n是选择的记录(即数据点)编号。记录从0开始编号,因此如果需要第一行,它应该是
every::0::0
<代码>每一个都可以在
绘图
splot
stats
中使用(在
stats
中使用
每一个
未记录)。我更喜欢
stats
,因为它不会打印任何内容,但会使您的gnuplot控制台混乱(编辑以避免混乱的控制台,请在
stats
命令末尾使用
nooutput
)。此外,您还可以使用
use
进行任意分配

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

stats "my2columndata.dat" u (firstdatapoint=$2) every ::0::0
现在要获取最后一条记录,您可以使用
stats
保存的记录数,并将其作为
中的记录数

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
现在你可以按你要求的情节来做了。
在我结束之前,还有一些额外的技巧:

使用,您甚至可以将每一列保存为多个变量。(注意:我使用速记
u
表示
使用
,而
ev
表示
每个

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


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

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

此解决方案与@andyras和@syockit现有答案的差异:

  • 也适用于非单调递减数据
  • 不需要
    stats
  • 还将处理具有多个空行的数据(@syockit的解决方案可能给出错误的结果)
  • 还返回
    n
    th数据点
也适用于gnuplot 4.6.0(操作时间问题)

数据:
“Data.dat”

代码:

### 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
结果:

### 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

如果您提供了示例输入和预期输出,那么回答起来会更容易。好的,很抱歉出现了歧义。谢谢谢谢这非常适合我,而且很简单,我很想知道你是如何为单个数字编制索引的,但这确实有效!我正在阅读类似的命令。