Gnuplot:输入数据中的表达式

时间:2016-11-18 16:53:57

标签: gnuplot

有没有办法指定输入数据是需要评估的表达式?

在我的情况下,数据是以" n / d"格式编码的有理数字。有没有办法告诉gnuplot解释" n / d" as" n除以d"?

示例输入数据:

1/9  1 
1/8  2
1/7  3
1/6  4

我试过了plot "data" using ($1):2,但这会截断" n / d"到" n"。

更新:在手册中进行了一些挖掘后,我发现在这种情况下我可以告诉gnuplot解释" /"作为列分隔符,然后将第一个数字除以第二个,如下所示:plot "data" using ($1/$2):3 '%lf/%lf %lf'

1 个答案:

答案 0 :(得分:2)

我不知道只有gnuplot的答案。但您可以使用system命令让其他程序完成工作。例如linux上的bc程序。以下脚本适用于我:

result(s) = system(sprintf('echo "%s" | bc -l ~/.bcrc', s)) + 0

set table "data.eval"
plot "data.dat" using 1:(result(strcol(2)))
unset table

这是数据文件:

1 1/2    
2 1/2.0  
3 4+4    
4 4*5-1  
5 4*(5-1)-(3-7)
6 sin(3.1415)

这是输出:

# Curve 0 of 1, 6 points
# Curve title: ""data.dat" using 1:(result(strcol(2)))"
# x y type
1  0.5  i
2  0.5  i
3  8    i
4  19   i
5  20   i
6  9.26536e-05  i

备注:

  • set table "data.eval"将值打印到文件中,现在更容易检查结果。
  • strcol(2)以字符串形式读取第二列的条目。表达式不得包含空格。
  • 函数result将字符串传输到bc。必须引用字符串本身,否则shell会抱怨数据文件的第5行或第6行中的括号。
  • bc上的选项-l启用表达式的浮点计算,如第一行(1/2 = 0.5而不是1/2 = 0),它定义s(s)和s(x)等函数e(x)表示exp(x)。
  • ~/.bcrc读取一些函数定义
  • system命令返回一个字符串。通过添加0将字符串提升为浮点数。

我的〜/ .bcrc看起来像这样:

pi=4*a(1)
e=e(1)

define ln(x)
{return(l(x))}

define lg(x)
{return(l(x)/l(10))}

define exp(x)
{return(e(x))}

define sin(x)
{return(s(x))}

define fac(x)
{if (x<=1) return(1);
       return(fac(x-1)*x)}

define ncr(n,r)
{return(fac(n)/(fac(r)*fac(n-r)))}

在Debian Jessie上使用gnuplot 4.6和bc 1.06.95进行测试。在Windows上,您可以使用set命令进行整数计算。 Google似乎知道其他一些命令行计算器。