153

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

4

10 に答える 10

202

スイッチを介して変数を入力できます-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引数を使用してshebang gnuplot#!/usr/bin/env gnuplotを実行する./foo.plg -e ...と、提供された引数の使用が無視されます。

于 2012-09-08T11:49:38.037 に答える
28

ここで提案されているように、環境を介して情報を渡すこともできます。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
于 2012-09-08T10:24:04.703 に答える
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 スクリプトのように) セミコロンで渡されますが、文字列変数は ' ' でカプセル化する必要があります (gnuplot 構文であり、Bash 構文ではありません)。

于 2014-06-17T20:29:03.393 に答える
14

unix/linux 環境では次のトリックを使用できます。

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

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

于 2013-12-09T12:20:02.597 に答える
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 で最新) だったため失敗しました。以下の shim は、元のスクリプトを変更することなく、この問題を解決しました。

#!/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 つのスクリプトを組み合わせると、gnuplot のバージョンや基本的に任意の *nix に関係なく、bash から gnuplot スクリプトにパラメーターを渡すことができます。

于 2016-10-27T06:01:23.827 に答える
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。

于 2013-12-06T17:11:12.497 に答える