直接从文本文件绘制函数

时间:2013-02-21 16:40:46

标签: awk gnuplot

有没有办法根据文本文件中的值绘制函数?

我知道如何在gnuplot中定义一个函数然后绘制它,但这不是我需要的。 我有一个表常常更新的函数常量。当这个更新发生时,我希望能够运行一个用这条新曲线绘制图形的脚本。由于绘制的数字很少,我想自动化该过程。

这是一个包含常量的示例表:

location a  b  c
1        1  3  4
2

我有两种方法可以解决问题,但我不知道是否以及如何实施这些问题。

  1. 然后我可以使用awk生成字符串:f(x)=1(x)**2+3(x)+4,将其写入文件并以某种方式使gnuplot读取此新文件并绘制在某个x范围内。
  2. 或在gnuplot中使用awk,如f(x) = awk /1/ {print "f(x)="$2等,或直接在plot命令中使用awk。
  3. 我无论如何,我已经陷入困境并且没有在网上找到解决这个问题的方法,你有什么建议吗?

3 个答案:

答案 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()函数,您必须知道:

  • 双引号内的东西不会被gnuplot
  • 解析
  • 该点用于连接gnuplot
  • 中的字符串
  • 必须转义awk 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

将选择该行并将其绘制