如何在gnuplot中使用数据文件的多行?

如何在gnuplot中使用数据文件的多行?,gnuplot,Gnuplot,我有一个包含两列的数据文件:Xi和Yi。我想为I>1绘制Xi与(Yi-1-Yi)/Yi-1的对比图。在GNUPlot direclty中可以做到这一点吗?在GNUPlot中直接做到这一点很棘手。问题是您必须在计算中使用第(i-1)个元素,这是gnuplot无法自动完成的。它可以进行简单的计算,但只能在同一行上进行,例如 plot "datafile" using ($1):(($2-$1)/$2) 这很容易 对于您需要做的事情,我建议,或者您可以使用电子表格应用程序准备数据文件 在倍频程中,您

我有一个包含两列的数据文件:
Xi
Yi
。我想为
I>1
绘制
Xi
(Yi-1-Yi)/Yi-1
的对比图。在GNUPlot direclty中可以做到这一点吗?

在GNUPlot中直接做到这一点很棘手。问题是您必须在计算中使用第(i-1)个元素,这是gnuplot无法自动完成的。它可以进行简单的计算,但只能在同一行上进行,例如

plot "datafile" using ($1):(($2-$1)/$2)
这很容易

对于您需要做的事情,我建议,或者您可以使用电子表格应用程序准备数据文件

在倍频程中,您可以这样绘制:

d = load("datafile")
plot(d(2:end, 1), d(1:end-1, 2)-d(2:end, 2)./d(1:end-1, 2))

是的,直接使用gnuplot是可能的——这并不容易:

firstval = NaN
yi1(yi) = (returnval=firstval, firstval=yi, returnval)
plot "datafile" using 1:((yi1($2)-$2)/returnval)
您需要使用内联函数。内联函数的形式如下:

funcname(args,...) = (statement1,statement2,...,statementn, return_value)

这里我刚刚创建了一个函数来保存它传递的最后一个值。不幸的是,这个解决方案变得有点难看,因为我无法在using规范中调用两次
yi1
(第二次,我会得到错误的返回值),所以我不得不直接引用包含返回值的变量。虽然不漂亮,但它很管用。通过传递
$0
(行号)并仅在$0发生变化时更新,您可能会稍微“美化”它,但这可能不值得进行此攻击。

如果您只想使用gnuplot(参见我的解决方案),您可以做这类事情,但如果您想要i-2或i-3元素,它很快就会变得很麻烦。无法检索i+1和i+2元素(但这不是什么大问题——只需改变索引:)@mgilson-没有想到这样一个解决方案:)我看到的唯一问题是,如果不重置
firstval
,您就无法执行
replot
,这肯定是真的——尽管我现在真的发现自己不太经常重复。