如何将命令行参数传递给gnuplot?


148

我想使用gnuplot从数据文件中绘制图形,例如foo.data。目前,我在命令文件中将数据文件名硬编码为foo.plt,然后运行命令gnuplot foo.plg以绘制数据。但是,我想将数据文件名作为命令参数传递,例如running command gnuplot foo.plg foo.data。如何解析gnuplot脚本文件中的命令行参数?谢谢。

Answers:


191

您可以通过开关输入变量 -e

$ gnuplot -e "filename='foo.data'" foo.plg

然后在foo.plg中可以使用该变量

$ cat foo.plg 
plot filename
pause -1

要使“ foo.plg”更加通用,请使用条件:

if (!exists("filename")) filename='default.dat'
plot filename
pause -1

注意,-e必须在文件名之前,否则文件在-e语句之前运行。特别是,#!/usr/bin/env gnuplot使用./foo.plg -e ...CLI参数运行shebang gnuplot 将忽略使用提供的参数。


20
这也可用于if提供默认值。 if ! exists("filename") filename='default.data'
mgilson 2012年

10
对于现在陷入困境的人们,mgilson的注释和Gnuplot 4.6补丁程序级别3要求使用if (!exists("filename")而不是if ! exists("filename")
Sam Mussmann

在Windows中如何做同样的事情?
padawan 2014年

6
@Chong:可以将它们串在一起,也可以在-e参数中指定每个,例如-e "filename='default.data'; foo='bar'"-e "filename='default.data'" -e "foo='bar"'
雷神

1
注意:-e ...选项必须在文件名之前。从man gnuplot我们的确可以看到:-e“命令列表” 在加载下一个输入文件之前执行请求的命令。
哈斯图尔

57

从5.0版开始,您可以使用标记将参数传递给gnuplot脚本-c。这些参数是通过变量访问ARG0ARG9ARG0作为脚本,并ARG1ARG9字符串变量。参数的数量由给出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

请注意,脚本名称没有变量,$0第一个参数也没有,变量在引号内调用。无法通过命令行直接使用此方法,只能使用@ con-fu-se建议的技巧。


我试图用-c与包含线,如脚本开关plot 'data' using 0:($1/100)gnuplot因错误无效表达式而死亡,因为$1它消失了。我哪里错了?请注意,如果不使用-c,脚本将成功运行。
lorcap 2015年

gnuplot 5.0通过在这些示例中添加一行来测试了它plot 'data' using 0:($1/100),但并没有得到您的认可。很少见,因为此版本定义了变量ARG0- ARG9,而不是$1- $9。我假设您也有版本5.0(是吗?),因为-c早期版本不支持该标志。我需要看一个最小的脚本,看看真正的问题在哪里:/
vagoberto

gnuplot 5.0 patchlevel 0cygwin下运行。单行脚本print ARG1; plot 'data' using 0:($1/100)正确打印了传递为的值ARG1,然后退出,并带有错误无效表达式,其指向的斜线print ARG1; plot 'data' using 0:(/100)
lorcap 2015年

27

您也可以按照此处的建议通过环境传递信息。Ismail Amin的示例在此处重复:

在外壳中:

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

6
您可以输入,而不是导出name=plot_data_file ./the_gnuplot_script
Edgar Bonet 2015年

@Edgar Bonet:为此需要哪个gnuplot版本?在使用4.2 ...的y机器上似乎
无法解决问题

嗨@Bjoern!我正在使用Gnuplot 4.6,但这不是Gnuplot功能,它是Shell的功能:name=value command告诉Shell在其环境中使用该特定变量运行命令。我正在使用bash 4.3.11,但我相信这是一个非常常见的shell功能。
Edgar Bonet

23

Jari Laamanen的答案是最好的解决方案。我只想解释一下如何在shell变量中使用多个输入参数:

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脚本中),但是需要使用''封装字符串变量(gnuplot语法,不是Bash语法)


1
对于gnuplot本身,无论使用'还是"使用字符串都没有关系。-e参数周围的引号必须"替换bash变量。以下内容也可以正常工作:OUTPUT=foobar; gnuplot -e "output=\"$OUTPUT\"; print output"
Christoph

感谢您确认我可以使用半冒号分割命令。其他答案均未显示此内容。
tommy.carstensen

14

您可以在unix / linux环境中使用技巧:

  1. 在gnuplot程序中:绘制“ / dev / stdin” ...

  2. 在命令行中:gnuplot program.plot <data.dat


12

这个问题已经很好地回答了,但是我想我可以在这里找到合适的人选,即使只是为了像我一样减少使用谷歌搜索的人的工作量。vagoberto的回答为我提供了解决此问题版本所需的工具,因此在此我将分享我的解决方案。

我在最新的环境中开发了一个绘图脚本,从而可以执行以下操作:

#!/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 'output.png' 2.3 6.7 4.3 7

上传到我的服务器并执行后,由于服务器版本为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中的参数。


5

您甚至可以做一些魔术,例如:

#!/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调用时替换了一些魔术令牌……),但是我简化了此示例以更好地理解。您还可以使其更简单。


4

在shell中写

gnuplot -persist -e "plot filename1.dat,filename2.dat"

并依次选择所需的文件。-persist用于使gnuplot屏幕停留,只要用户不手动退出它即可。


在Win7控制台中,选项-persist似乎不起作用?例如,gnuplot -persist -c "myscript.plt" "mydata.csv" "myoutput.png"该命令可以正常运行,并且按我期望的方式获得文件“ myoutput.png”,但是没有出现gnuplot屏幕(exitmyscript.plt中为NO 命令)。为什么?以及如何在示例中显示gnuplot屏幕?
lyl

1

还有另一种方式是:

您有一个名为gnuplot脚本scriptname.gp

#!/usr/bin/gnuplot -p
# This code is in the file 'scriptname.gp'
EPATH = $0
FILENAME = $1 

plot FILENAME

现在,您可以scriptname.gp通过这种复杂的语法调用gnuplot脚本:

echo "call \"scriptname.gp\" \"'.'\" \"'data.dat'\"" | gnuplot 

0

如果您需要位置参数,@ vagoberto的答案似乎是最好的恕我直言,我还有一点改进。

瓦戈贝托的建议:

#!/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

对于像我这样的懒惰打字员,可以使脚本可执行(chmod 755 script.gp

然后使用以下命令:

#!/usr/bin/env gnuplot -c

THIRD=ARG3
print "script name        : ", ARG0
print "first argument     : ", ARG1
print "third argument     : ", THIRD
print "number of arguments: ", ARGC

并执行为:

$ ./imb.plot a b c d
script name        : ./imb.plot
first argument     : a
third argument     : c
number of arguments: 4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.