有没有办法根据文本文件中的值绘制函数?
我知道如何在gnuplot中定义一个函数然后绘制它,但这不是我需要的。 我有一个表常常更新的函数常量。当这个更新发生时,我希望能够运行一个用这条新曲线绘制图形的脚本。由于绘制的数字很少,我想自动化该过程。
这是一个包含常量的示例表:
location a b c
1 1 3 4
2
我有两种方法可以解决问题,但我不知道是否以及如何实施这些问题。
f(x)=1(x)**2+3(x)+4
,将其写入文件并以某种方式使gnuplot读取此新文件并绘制在某个x
范围内。f(x) = awk /1/ {print "f(x)="$2
等,或直接在plot命令中使用awk。我无论如何,我已经陷入困境并且没有在网上找到解决这个问题的方法,你有什么建议吗?
答案 0 :(得分:3)
对于这个有一个通用版本的另一种可能性,您可以执行以下操作:
假设参数存储在文件parameters.dat
中,第一行包含变量名,其他参数集包含参数集,如
location a b c
1 1 3 4
脚本文件如下所示:
file = 'parameters.dat'
par_names = system('head -1 '.file)
par_cnt = words(par_names)
# which parameter set to choose
par_line_num = 2
# select the respective string
par_line = system(sprintf('head -%d ', par_line_num).file.' | tail -1')
par_string = ''
do for [i=1:par_cnt] {
eval(word(par_names, i).' = '.word(par_line, i))
}
f(x) = a*x**2 + b*x + c
plot f(x) title sprintf('location = %d', location)
答案 1 :(得分:1)
这个问题(gnuplot store one number from data file into variable)在第一个答案中对我有一些暗示。
在我的情况下,我有一个包含抛物线参数的文件。我已将参数保存在gnuplot变量中。然后我绘制包含每个时间步长的参数变量的函数。
#!/usr/bin/gnuplot
datafile = "parabola.txt"
set terminal pngcairo size 1000,500
set xrange [-100:100]
set yrange [-100:100]
titletext(timepar, apar, cpar) = sprintf("In timestep %d we have parameter a = %f, parameter c = %f", timepar, apar, cpar)
do for [step=1:400] {
set output sprintf("parabola%04d.png", step)
# read parameters from file, where the first line is the header, thus the +1
a=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $1}' " . datafile)
c=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $2}' " . datafile)
# convert parameters to numeric format
a=a+0.
c=c+0.
set title titletext(step, a, c)
plot c+a*x**2
}
这给出了一系列名为parabola0001.png的png文件,
parabola0002.png,
parabola0003.png,
...,每个都显示一个抛物线,其参数从名为parabola.txt
的文件中读取。标题包含给定时间步的参数。
要了解gnuplot system()
函数,您必须知道:
printf
命令的双引号,以便将它们从gnuplot解析器中隐藏要测试此gnuplot脚本,请将其保存到具有任意名称的文件中,例如parabolaplot.gplot
并将其设为可执行文件(chmad a+x parabolaplot.gplot
)。可以使用
parabola.txt
文件
awk 'BEGIN {for (i=1; i<=1000; i++) printf "%f\t%f\n", i/200, i/100}' > parabola.txt
答案 2 :(得分:0)
awk '/1/ {print "plot "$2"*x**2+"$3"*x+"$4}' | gnuplot -persist
将选择该行并将其绘制