【问题标题】:accessing the nth datapoint in a datafile using gnuplot使用 gnuplot 访问数据文件中的第 n 个数据点
【发布时间】:2012-12-21 08:24:36
【问题描述】:

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

例如

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

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

【问题讨论】:

  • 如果您提供示例输入和预期输出,会更容易回答。
  • 好的,很抱歉有歧义。谢谢!

标签: gnuplot


【解决方案1】:

这个想法和@andyras 的一样,但是使用stats

要回答标题,您可以使用every ::n::n,其中 n 是选择的记录(即数据点)编号。记录从 0 开始编号,所以如果你想要第一行,它应该是 every ::0::0every 可用于plotsplotstatseverystats 中的用法未记录)。我更喜欢stats,因为它不绘制任何东西,但它确实使您的gnuplot 控制台混乱(EDIT 以避免混乱的控制台在stats 命令的末尾使用nooutput)。此外,您可以使用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 表示using,而ev 表示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 作者使这成为可能:)

【讨论】:

    【解决方案2】:

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

    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 个数据点(正如您的问题标题所暗示的那样)会比较棘手。

    【讨论】:

    • 谢谢!这非常适合我并且很简单我很想知道您如何索引各个数字,但这确实有效!我正在阅读类似的命令。
    【解决方案3】:

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

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

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

    也适用于 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      相关资源
      最近更新 更多