command-line - example - gnuplot plot points




Comment passer l'argument de la ligne de commande à gnuplot? (6)

Je veux utiliser gnuplot pour dessiner la figure du fichier de données, disons foo.data . Actuellement, j'ai codé en dur le nom du fichier de données dans le fichier de commandes, disons foo.plt , et exécutez la commande gnuplot foo.plg pour tracer les données. Cependant, je veux passer le nom du fichier de données comme un argument de commande, par exemple en exécutant la commande gnuplot foo.plg foo.data . Comment analyser les arguments de ligne de commande dans le fichier de script gnuplot? Merci.


Cette question est bien répondue mais je pense que je peux trouver un créneau à remplir ici, ne serait-ce que pour réduire la charge de travail de quelqu'un qui google comme moi. La réponse de vagoberto m'a donné ce dont j'avais besoin pour résoudre ma version de ce problème et donc je vais partager ma solution ici.

J'ai développé un script intrigue dans un environnement à jour qui m'a permis de faire:

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

Cela s'exécute parfaitement à partir de la ligne de commande dans un environnement avec un gnuplot récent (5.0.3 dans mon cas).

$ ./plotStuff.gp 'output.png' 2.3 6.7 4.3 7

Une fois téléchargé sur mon serveur et exécuté, il a échoué car la version du serveur était 4.6.4 (actuelle sur Ubuntu 14.04 LTS). Le shim ci-dessous a résolu ce problème sans nécessiter de modification du script d'origine.

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

La combinaison de ces deux scripts permet de passer des paramètres des scripts bash vers gnuplot sans tenir compte de la version de gnuplot et dans la plupart des * nix.


Dans le shell écrivez

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

et consécutivement les fichiers que vous voulez. -persist est utilisé pour que l'écran gnuplot reste tant que l'utilisateur ne le quitte pas manuellement.


La réponse de Jari Laamanen est la meilleure solution. Je veux juste expliquer comment utiliser plus de 1 paramètre d'entrée avec des variables shell:

output=test1.png
data=foo.data
gnuplot -e "datafile='${data}'; outputname='${output}'" foo.plg

et foo.plg:

set terminal png
set outputname 
f(x) = sin(x)
plot datafile

Comme vous pouvez le voir, plus de paramètres sont passés avec des points-virgules (comme dans les scripts bash), mais les variables de type String DOIVENT être encapsulées avec '' (syntaxe gnuplot, syntaxe NOT Bash)


Vous pourriez même faire un peu de magie de la coquille, par exemple:

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

Ma mise en œuvre est un peu plus complexe (par exemple remplacer des jetons magiques dans l'appel sed, alors que je suis déjà là ...), mais j'ai simplifié cet exemple pour une meilleure compréhension. Vous pourriez également le rendre encore plus simple .... YMMV.


Vous pouvez entrer des variables via le commutateur -e

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

Dans foo.plg vous pouvez ensuite utiliser cette variable

$ cat foo.plg 
plot filename
pause -1

Pour rendre "foo.plg" un peu plus générique, utilisez un conditionnel:

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

Vous pouvez passer des arguments à un script gnuplot depuis la version 5.0, avec l'option -c . Ces arguments sont accessibles via les variables ARG0 à ARG9 , ARG0 étant le script, et ARG1 à ARG9 variables de chaîne. Le nombre d'arguments est donné par ARGC .

Par exemple, le script suivant ("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 

peut être appelé comme:

$ gnuplot -c script.gp one two three four five
script name        : script.gp
first argument     : one
third argument     : three
number of arguments: 5

ou dans gnuplot comme

gnuplot> call 'script.gp' one two three four five
script name        : script.gp
first argument     : one
third argument     : three
number of arguments: 5

Dans gnuplot 4.6.6 et versions antérieures, il existe un mécanisme d' call avec une syntaxe différente (maintenant obsolète). Les arguments sont accessibles via $# , $0 , ..., $9 . Par exemple, le même script ci-dessus ressemble à:

#!/usr/bin/gnuplot --persist

THIRD="$2"
print "first argument     : ", "$0"
print "second argument    : ", "$1"
print "third argument     : ", THIRD
print "number of arguments: ", "$#"

et il est appelé dans gnuplot as (rappelez-vous, version <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

Notez qu'il n'y a pas de variable pour le nom du script, donc $0 est le premier argument, et les variables sont appelées entre guillemets. Il n'y a aucun moyen de l'utiliser directement à partir de la ligne de commande, seulement par des astuces comme celle suggérée par @ con-fu-se.





gnuplot