gnuplot에 명령 줄 인수를 전달하는 방법은 무엇입니까?


148

gnuplot을 사용하여 foo.data 와 같은 데이터 파일에서 그림을 그리 려고 합니다. 현재 명령 파일에 foo.plt 와 같은 데이터 파일 이름을 하드 코딩하고 명령 gnuplot foo.plg을 실행 하여 데이터를 플로팅했습니다. 그러나 데이터 파일 이름을 명령 인수로 전달하고 싶습니다 (예 : running command) gnuplot foo.plg foo.data. gnuplot 스크립트 파일에서 명령 행 인수를 구문 분석하는 방법은 무엇입니까? 감사.

답변:


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문. 특히 CLI 인수 #!/usr/bin/env gnuplot와 함께 shebang gnuplot 을 실행하면 ./foo.plg -e ...제공된 인수 사용이 무시됩니다.


20
또한 if기본값을 제공 하는 데 사용할 수 있습니다 . if ! exists("filename") filename='default.data'
mgilson

10
이 문제를 겪고있는 사람들에게는 mgilson의 의견과 Gnuplot 4.6 패치 레벨 3이 if (!exists("filename")대신에 필요 합니다 if ! exists("filename").
Sam Mussmann

Windows에서 동일한 작업을 수행하는 방법은 무엇입니까?
padawan

6
@Chong : 문자열을 함께 묶거나 각각을 -e인수로 제공하십시오 (예 : -e "filename='default.data'; foo='bar'"또는) -e "filename='default.data'" -e "foo='bar"'.
Thor

1
참고 :-e ... 옵션은 파일 이름을 선행해야한다. 사실에서 man gnuplot우리는 읽을 수 있습니다 : -e"명령 목록"요청 된 명령을 실행 다음 입력 파일을로드하기 전에 . .
Hastur

57

버전 5.0부터 gnuplot 스크립트에 플래그를 사용하여 인수를 전달할 수 있습니다 -c. 이 인수는 변수를 통해 액세스 ARG0ARG9, ARG0스크립트 및 인 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

gnuplot 5.0이 예제에와 같은 줄을 추가하여 테스트했지만 plot 'data' using 0:($1/100)말한 내용을 얻지 못했습니다. 이 버전은 변수를 정의하기 때문에 그것은 드문 것 ARG0- ARG9, 그리고 $1- $9. -c플래그가 이전 버전에서 지원되지 않기 때문에 버전 5.0도 사용한다고 가정합니다 . 진짜 문제입니다 내가 볼 수있는 최소한의 스크립트를 참조해야합니다 : /
vagoberto

나는 실행 해요 gnuplot 5.0 patchlevel 0에서 Cygwin에서 . 한 줄 스크립트 print ARG1; plot 'data' using 0:($1/100)는 전달 된 값을 올바르게 인쇄 ARG1한 다음 슬래시를 가리키는 오류 유효하지 않은 표현식으로 종료됩니다 print ARG1; plot 'data' using 0:(/100).
lorcap

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

@ Edgar Bonet : 이것에 어떤 gnuplot 버전이 필요합니까? 4.2를 사용하는 y 머신에서는 작동하지 않는 것 같습니다 ...
Bjoern

안녕 @ 비요른! Gnuplot 4.6을 사용하고 있지만 이것은 Gnuplot 기능이 아니며 쉘의 기능입니다. 쉘 name=value command이 환경에서 특정 변수로 명령을 실행하도록 지시합니다. bash 4.3.11을 사용하고 있지만 매우 일반적인 쉘 기능이라고 생각합니다.
Edgar Bonet

23

Jari Laamanen의 답변이 최고의 솔루션입니다. 쉘 변수와 함께 둘 이상의 입력 매개 변수를 사용하는 방법을 설명하고 싶습니다.

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 스크립트와 같이) 문자열 변수 NEED는 ''(gnuplot 구문, NOT Bash 구문)으로 캡슐화되어야합니다


1
gnuplot 자체의 경우 '또는 "문자열 을 사용하는지 여부는 중요하지 않습니다 . -e인수 주위의 따옴표 "는 bash 변수를 대체 해야합니다 . 다음도 잘 작동합니다.OUTPUT=foobar; gnuplot -e "output=\"$OUTPUT\"; print output"
Christoph

세미콜론을 사용하여 명령을 분할 할 수 있음을 확인해 주셔서 감사합니다. 다른 답변은 이것을 보여주지 않습니다.
tommy.carstensen 2019

14

유닉스 / 리눅스 환경에서 트릭을 사용할 수 있습니다 :

  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

이 두 스크립트를 조합하면 gnuplot 버전 및 기본적으로 * nix와 상관없이 bash에서 gnuplot 스크립트로 매개 변수를 전달할 수 있습니다.


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 호출에서 일부 마법 토큰을 교체하는 중입니다 ...) 이미 이해하기 쉽도록이 예제를 단순화했습니다. 당신은 또한 더 간단하게 만들 수 있습니다 .... YMMV.


4

쉘 쓰기

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의 답변이 가장 좋은 IMHO로 보이며 추가 할 약간의 개선 사항이 있습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.