【问题标题】:Getting the value of a specific element from a different row in gnuplot从 gnuplot 中的不同行获取特定元素的值
【发布时间】:2008-10-28 05:28:53
【问题描述】:

使用 gnuplot 4.2,是否可以获取特定列/行的值并以某种方式使用该值?

例如,假设我的数据文件包含以下内容

#1  2
7  13
5  11
23 17
53 12

对于一个简单的绘图,其中第 1 列是 x 轴,第 2 列是 y 轴,我会:-

plot 'datafile' using 1:2

我要做的是通过该列中的第一个元素 (13) 来规范化第 2 列中的所有数据。有没有办法在 gnuplot 本身中做到这一点(即,不求助于脚本语言或其他东西来首先预处理数据)?

干杯

【问题讨论】:

    标签: scripting graph plot gnuplot


    【解决方案1】:

    使用运行平均值演示,我设法实现了一个标准化为第二列的第一个值的图。

    base变量用于存储引用值,first函数在第一行初始化base

    first(x) = ($0 > 0 ? base : base = x)
    plot file.dat u 1:(first($2), base/$2)
    

    应该提到的是,这不是使用 gnuplot 4.2 完成的。

    编辑:根据 Christoph 的建议进行了更新。

    【讨论】:

    • 很好,+1。更一般地说,可以检查行号是否为 0 以设置 base 值:first(x) = ($0 > 0 ? base : base = x)
    • 但是,此解决方案假定文件不包含单个或两个空行。如果您有空行,您将多次出现$0==0 条件。
    【解决方案2】:

    如果您的基值(例如 13)在数据集的第一行,您应该能够使用 CVS 版本的 gnuplot 做您想做的事情。

    看看running averages demo。按照这些思路,您可以编写一个自定义函数,在第一次调用时将基值存储在自定义变量中,并在后续调用时返回该变量。

    (由于该演示仅针对 CVS 版本列出,我假设当前发布版本中不提供所需的功能。)

    【讨论】:

      【解决方案3】:

      您可以使用stats命令获取第二列的第一个值并将其存储在reference变量中,如下所示,

      stats 'datafile' using (reference=$2) every ::0::0 nooutput
      

      您可以将$2 替换为您想要的任何其他列。 every ::0::0 中的零表示该列的第一个条目,您也可以使用 every ::n::n 获取该列的第 n 个条目。 nooutput 用于避免混乱的控制台。

      然后您可以使用,

      plot 'datafile' using 1:($2/reference)
      

      【讨论】:

      • 为了完整性:如果您的数据中可能有单个或两个空行,您最好使用:stats 'datafile' u (reference=$2) index 0 every ::0:0:0:0 nooutput,否则您可能会得到意想不到的结果。
      【解决方案4】:

      添加一个满是 13 的新列,然后使用:

      使用 1:($2/$3) 绘制“数据文件”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-17
        • 1970-01-01
        相关资源
        最近更新 更多