web-dev-qa-db-ja.com

コマンドライン引数をgnuplotに渡す方法は?

foo.dataのように、gnuplotを使用してデータファイルから図形を描画します。現在、コマンドファイルにデータファイル名をハードコーディングし、たとえばfoo.pltを指定し、コマンドgnuplot foo.plgを実行してデータをプロットします。ただし、コマンドファイルの引数としてデータファイル名を渡します。コマンドgnuplot foo.plg foo.dataを実行しています。 gnuplotスクリプトファイルのコマンドライン引数を解析する方法は?ありがとう。

134
Yun Huang

スイッチを介して変数を入力できます-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
172
Jari Laamanen

-cフラグを使用して、バージョン5.0以降のgnuplotスクリプトに引数を渡すことができます。これらの引数には、変数ARG0からARG9ARG0がスクリプト、ARG1から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

スクリプト名に変数がないため、$0が最初の引数であり、変数は引用符内で呼び出されます。これをコマンドラインから直接使用する方法はありません。@ con-fu-seが提案するトリックを使用する方法のみです。

46
vagoberto

here のように、環境を通じて情報を渡すこともできます。 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
26
Thor

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スクリプトのように)より多くのパラメーターがセミコロンで渡されますが、文字列変数は ''でカプセル化する必要があります(gnuplot構文、not bash構文)

22
Mo3bius

UNIX/Linux環境でトリックを使用できます。

  1. gnuplotプログラムの場合:plot "/ dev/stdin" ...

  2. コマンドライン:gnuplot program.plot <data.dat

14
arto

この質問はよく答えられていますが、私がやったようにこれをグーグルで誰かのワークロードを減らすためだけに、ここで満たすニッチを見つけることができると思います。 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

これらの2つのスクリプトを組み合わせることで、パラメーターをbashからgnuplotスクリプトに渡すことができ、gnuplotのバージョンに関係なく、基本的にすべての* nixで使用できます。

10
bp.

シェルマジックを実行することもできます。このような:

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

5
Stefan

シェルで書く

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

続けて必要なファイル。 -persistは、ユーザーが手動で終了しない限り、gnuplot画面を維持するために使用されます。

4
Aniruddha Bera

さらに別の方法は次のとおりです。

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 
2
con-f-use