如何将命令行parameter passing给gnuplot?
我想用gnuplot从数据文件中绘制graphics,比如foo.data 。 目前,我在命令文件中对数据文件名称进行了硬编码,比如说foo.plt ,然后运行命令gnuplot foo.plg
来绘制数据。 但是,我想传递数据文件名作为命令参数,例如运行命令gnuplot foo.plg foo.data
。 如何parsinggnuplot脚本文件中的命令行参数? 谢谢。
您可以通过开关-e
inputvariables
$ gnuplot -e "filename='foo.data'" foo.plg
在foo.plg中,您可以使用该variables
$ cat foo.plg plot filename pause -1
为了使“foo.plg”更具通用性,请使用条件:
if (!exists("filename")) filename='default.dat' plot filename pause -1
您可以使用标志-c
从5.0版本开始将parameter passing给gnuplot脚本。 这些参数是通过variablesARG0
到ARG9
, ARG0
是脚本和ARG1
到ARG9
stringvariables来ARG9
。 参数的数量由ARGC
给出。
例如,以下脚本(“script.gp”)
#!/usr/local/bin/gnuplot --persist THIRD=ARG3 print "script name : ", ARG0 print "first argument : ", ARG1 print "third argument : ", THIRD print "number of arguments: ", ARGC
可以被称为:
$ gnuplot -c script.gp one two three four five script name : script.gp first argument : one third argument : three number of arguments: 5
或者在gnuplot内
gnuplot> call 'script.gp' one two three four five script name : script.gp first argument : one third argument : three number of arguments: 5
在gnuplot 4.6.6和更早的版本中,存在一个具有不同(现在不推荐)的语法的call
机制。 参数通过$#
, $0
,…, $9
。 例如,上面的脚本看起来像:
#!/usr/bin/gnuplot --persist THIRD="$2" print "first argument : ", "$0" print "second argument : ", "$1" print "third argument : ", THIRD print "number of arguments: ", "$#"
它被称为gnuplot内(记住,版本<4.6.6)
gnuplot> call 'script4.gp' one two three four five first argument : one second argument : two third argument : three number of arguments: 5
注意脚本名没有variables,所以$0
是第一个参数,variables在引号内被调用。 没有办法直接从命令行使用它,只能通过@ con-fu-sebuild议的技巧来使用它。
您也可以像这里所build议的那样通过环境传递信息。 Ismail Amin的例子在这里重复:
在shell中:
export name=plot_data_file
在Gnuplot脚本中:
#! /usr/bin/gnuplot name=system("echo $name") set title name plot name using ($16 * 8):20 with linespoints notitle pause -1
Jari Laamanen的答案是最好的解决scheme。 我只想解释如何在shellvariables中使用多个input参数:
output=test1.png data=foo.data gnuplot -e "datafile='${data}'; outputname='${output}'" foo.plg
和foo.plg:
set terminal png set outputname f(x) = sin(x) plot datafile
正如你所看到的,更多的参数是用分号(如bash脚本)传递的,但是stringvariables需要用''(gnuplot语法,NOT Bash语法)
您可以在unix / linux环境下使用技巧:
-
在gnuplot程序中:绘制“/ dev / stdin”…
-
在命令行中:gnuplot program.plot <data.dat
你甚至可以做一些shell魔法,比如:
#!/bin/bash inputfile="${1}" #you could even do some getopt magic here... ################################################################################ ## generate a gnuplotscript, strip off bash header gnuplotscript=$(mktemp /tmp/gnuplot_cmd_$(basename "${0}").XXXXXX.gnuplot) firstline=$(grep -m 1 -n "^#!/usr/bin/gnuplot" "${0}") firstline=${firstline%%:*} #remove everything after the colon sed -e "1,${firstline}d" < "${0}" > "${gnuplotscript}" ################################################################################ ## run gnuplot /usr/bin/gnuplot -e "inputfile=\"${inputfile}\"" "${gnuplotscript}" status=$? if [[ ${status} -ne 0 ]] ; then echo "ERROR: gnuplot returned with exit status $?" fi ################################################################################ ## cleanup and exit rm -f "${gnuplotscript}" exit ${status} #!/usr/bin/gnuplot plot inputfile using 1:4 with linespoints #... or whatever you want
我的实现有点复杂(例如,在sed调用中replace了一些魔法令牌,而我已经在…),但为了更好的理解,我简化了这个例子。 你也可以使它更简单…. YMMV。
这个问题已经得到了很好的回答,但是我想我可以find一个适当的位置来填补这个空白,如果只是为了减less像我这样使用Google的人的工作量。 从vagoberto的答案给了我需要解决我的这个问题的版本,所以我会在这里分享我的解决scheme。
我在一个最新的环境中开发了一个剧本脚本,允许我这样做:
#!/usr/bin/gnuplot -c set terminal png truecolor transparent crop set output ARG1 set size 1, 0.2 rrLower = ARG2 rrUpper = ARG3 rrSD = ARG4 resultx = ARG5+0 # Type coercion required for data series resulty = 0.02 # fixed # etc.
这个在最近使用gnuplot的环境(命令行5.0.3)中执行的效果非常好。
$ ./plotStuff.gp
当上传到我的服务器并执行,它失败了,因为服务器版本是4.6.4(目前在Ubuntu 14.04 LTS)。 下面的垫片解决了这个问题,而不需要改变原来的脚本。
#!/bin/bash # GPlot v<4.6.6 doesn't support direct command line arguments. #This script backfills the functionality transparently. SCRIPT="plotStuff.gp" ARG1=$1 ARG2=$2 ARG3=$3 ARG4=$4 ARG5=$5 ARG6=$6 gnuplot -e "ARG1='${ARG1}'; ARG2='${ARG2}'; ARG3='${ARG3}'; ARG4='${ARG4}'; ARG5='${ARG5}'; ARG6='${ARG6}'" $SCRIPT
这两个脚本的组合允许将参数从bash传递到gnuplot脚本,而不考虑gnuplot版本和基本上任何* nix。
还有一种方法是:
你有一个名为scriptname.gp
的gnuplot脚本:
#!/usr/bin/gnuplot -p # This code is in the file 'scriptname.gp' EPATH = $0 FILENAME = $1 plot FILENAME
现在你可以通过这个令人费解的语法和平来调用gnuplot脚本scriptname.gp
:
echo "call \"scriptname.gp\" \"'.'\" \"'data.dat'\"" | gnuplot
在shell中写
gnuplot -persist -e "plot filename1.dat,filename2.dat"
并连续你想要的文件。 -persist用于使gnuplot屏幕保持不变,只要用户不手动退出即可。