有没有办法指定输入数据是需要评估的表达式?
在我的情况下,数据是以" 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'
答案 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行中的括号。-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似乎知道其他一些命令行计算器。