我拥有的数据在文本文件中采用以下格式:
#REY2_0 REY1_0 alpha1 alpha2 omega
100 200 (-0.1,0) (1,0) (0.94379237,-0.052310783)
值列表很长。我需要找到 REY2_0 和 REY1_0 的值,其中 omega 的第二部分值为 0(在上面的例子中,第二部分是指值 -0.052310783)。我可以使用 gnuplot 执行此搜索操作并绘制 REY2_0 v/s REY1_0 吗?此外,由于大多数值并不完全为零,我还想获取 REY2_0 和 REY1_0 的值,其中前三位数字为零(即其形式为 0.000xxxxxx)
答案1
让我们提前清理你的数据(
。linux)
命令sed
是一个不错的选择(column -t
会给出一个很好的格式)
sed 's/[(,)]/\t/g' data.dat | column -t > data02.dat
我们假设您的原始文件名为data.dat
,我们将创建一个名为 的新文件data02.dat
。新文件将有 8 列。在格努普特您可以访问单个列,并选择using ($1):($8)
使用第一列的数据作为X以及第八列的数据是。
现在诡计:定义一个函数来回答是如果满足条件,则使用加法,如果不满足条件,则使用加法。这是因为 gnuplot 将跳过是值是无限的。所以格努普特你可以写
myf(y,t)= t == 0 ? y : 1.0/0.
plot 'data2.dat' us ($1):(myf($2,$8))
当然,您可以采用更紧凑的方式来执行此操作,但在我看来,这样写更容易理解。
对于第二个问题,可以在函数中设置不同的条件
myf2(x,y)= ( 0.001 > abs(x) ) && ( 0.001 > abs(y) ) ? y : 1.0/0
plot 'data2.dat' us ($1):(myf2($1,$2))
其中abs(x)
返回一个数字的绝对值(没有符号的数字)。
注意:好吧,我很懒,而不是using
我只写us
。Gnuplot明白它。