说我有以下文件:
1,2,3
4,5,6
7,8,9
我想让gnuplot绘制形式为 x ^ 2 + b x + c的3个多项式,使用文件值作为系数。直接执行此操作,我会这样做:
plot x**2+2*x+3, 4*x**2+5*x+6, 7*x**2+8*x+9
但我想以编程方式对输入文件中的任意行数进行此操作。
我想我可能会受到this answer启发的代码的接近:
n= "`awk 'END {print NR}' < test.dat`"
i=0
while i<n{
f(a,b,c,x)=a*x**2+b*x+c
plot 'test.dat' every ::i::i using f($1,$2,$3,x)
}
但是undefined variable: x
答案 0 :(得分:1)
我多年来一直有同样的问题,最后我设法找到了解决方案。
它需要创造性地使用stats
函数将文件中的值分配给变量,并需要一些do for [...]
循环来将某些命令存储在临时文件中
filename = "InputFileName.dat"
stats filename nooutput
nlines = STATS_records-1
set print "temp.gnuplot"
do for [i=0:nlines] {\
print sprintf("stats filename every ::%i::%i using (a%i=$1,b%i=$2,c%i=$3,0):(0) nooutput",i,i,i,i,i)}
set print
load "temp.gnuplot"
set print "temp.gnuplot"
do for [i=1:nlines] {print sprintf("replot a%i*x**2 + b%i*x + c%i",i,i,i)}
plot a0*x**2 + b0*x +c0
load "temp.gnuplot"
set print
根据需要更改filename
变量。完成系统调用(例如! rm temp.gnuplot
。
我知道不是特别优雅,我特别喜欢使用临时文件,如果有人知道如何执行字符串变量,我很高兴知道。但是,嘿,它有效(即使在Windows下)!
修改:忘记将thse归功于输入。
答案 1 :(得分:0)
这是一个旧线程但是由于之前的回答,我可以使用字符串而不是临时文件来提出升级版本。那个,之后没有必要打扰删除无用的临时文件。
filename = "InputFileName.dat"
stats filename nooutput
nlines = STATS_records-1
paramstr(N) = sprintf("stats filename every ::%i::%i using (a%i=$1,b%i=$2,c%i=$3,0):(0) nooutput",N,N,N,N,N)
do for [i=0:nlines] {
eval(paramstr(i))
}
plotstr = "p "
do for [i=0:nlines] {
plotstr = plotstr . sprintf("a%i*x**2 + b%i*x + c%i%s",i,i,i,(i == nlines) ? "" : ", ")
}
eval(plotstr)
可能需要进行一些set xrange
和set yrange
调整才能查看您感兴趣的内容。