2

我有一个包含两列的数据文件:XiYi. 我想绘制Xi(Yi-1 - Yi)/Yi-1for 的对比图i>1。是否可以在 GNUPlot 直接中做到这一点?

4

2 回答 2

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)

在这里,我刚刚创建了一个函数来保存它传递的最后一个值。不幸的是,这个解决方案变得有点难看,因为我不能yi1在 using 规范中调用两次(第二次,我会得到错误的返回值),所以我不得不直接引用保存返回值的变量。它不漂亮,但它有效。您可以通过传递(行号)并仅在 $0 更改时才更新它可能会“漂亮”一点$0,但是对于这个 hack 可能不值得。

于 2012-11-13T22:58:20.853 回答
0

直接在 gnuplot 中执行此操作很棘手。问题是您必须在计算中使用第 (i-1) 个元素,而 gnuplot 无法自动执行此操作。它可以做简单的计算,但只能在同一行,例如

plot "datafile" using ($1):(($2-$1)/$2)

会很容易。

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

在八度音程中,您可以这样绘制:

d = load("datafile")
plot(d(2:end, 1), d(1:end-1, 2)-d(2:end, 2)./d(1:end-1, 2))
于 2012-11-13T22:28:50.110 回答