Je veux utiliser gnuplot pour dessiner une figure à partir d'un 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 j'ai exécuté la commande gnuplot foo.plg
pour tracer les données. Cependant, je veux passer le nom du fichier de données comme argument de commande, par exemple commande en cours d'exécution gnuplot foo.plg foo.data
. Comment analyser les arguments de ligne de commande dans le fichier de script gnuplot? Merci.
la source
if
pour fournir des valeurs par défaut.if ! exists("filename") filename='default.data'
if (!exists("filename")
au lieu deif ! exists("filename")
.-e
argument, par exemple-e "filename='default.data'; foo='bar'"
ou-e "filename='default.data'" -e "foo='bar"'
.-e ...
option doit précéder le nom du fichier. En effet à partir deman gnuplot
nous pouvons lire:-e
"command list" exécute les commandes demandées avant de charger le fichier d'entrée suivant . .Vous pouvez passer des arguments à un script gnuplot depuis la version 5.0, avec l'indicateur
-c
. Ces arguments sont accessibles via les variablesARG0
àARG9
,ARG0
étant le script, etARG1
auxARG9
variables de chaîne. Le nombre d'arguments est donné parARGC
.Par exemple, le script suivant ("script.gp")
peut être appelé comme:
ou dans gnuplot comme
Dans gnuplot 4.6.6 et versions antérieures, il existe un
call
mécanisme avec une syntaxe différente (désormais obsolète). Les arguments sont accessibles par$#
,$0
...,$9
. Par exemple, le même script ci-dessus ressemble à:et il est appelé dans gnuplot comme (rappelez-vous, version <4.6.6)
Notez qu'il n'y a pas de variable pour le nom du script, de même que
$0
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, uniquement par des astuces comme celle suggérée par @ con-fu-se.la source
-c
commutateur avec un script contenant des lignes telles queplot 'data' using 0:($1/100)
.gnuplot
meurt avec l'erreur expression invalide car a$1
disparu. Où ai-je tort? Notez que sans-c
, le script s'exécute correctement.gnuplot 5.0
en ajoutant à ces exemples une ligne commeplot 'data' using 0:($1/100)
, et je n'ai pas compris ce que vous dites. Ce serait rare, puisque cette version définit les variablesARG0
-ARG9
, et non$1
-$9
. Je suppose que vous avez également la version 5.0 (avez-vous?), Car le-c
drapeau n'est pas pris en charge par les versions antérieures. J'aurais besoin de voir un script minimal pour voir où est le vrai problème: /gnuplot 5.0 patchlevel 0
sous cygwin . Le script sur une ligneprint ARG1; plot 'data' using 0:($1/100)
imprime correctement la valeur transmise en tantARG1
que puis se termine avec l' expression d' erreur non valide pointant sur la barre oblique deprint ARG1; plot 'data' using 0:(/100)
.Vous pouvez également transmettre des informations via l'environnement comme suggéré ici . L'exemple d' Ismail Amin est répété ici:
Dans la coquille:
Dans un script Gnuplot:
la source
name=plot_data_file ./the_gnuplot_script
.name=value command
dit au shell d'exécuter la commande avec cette variable particulière dans son environnement. J'utilise bash 4.3.11, mais je pense que c'est une fonctionnalité de shell très courante.La réponse de Jari Laamanen est la meilleure solution. Je veux juste expliquer comment utiliser plus d'un paramètre d'entrée avec des variables shell:
et foo.plg:
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 chaîne DOIVENT être encapsulées avec '' (syntaxe gnuplot, PAS syntaxe Bash)
la source
'
ou"
pour les chaînes. Les guillemets extérieurs autour de l'-e
argument doivent être"
remplacés par les variables bash. Ce qui suit fonctionne également très bien:OUTPUT=foobar; gnuplot -e "output=\"$OUTPUT\"; print output"
Vous pouvez utiliser astuce dans un environnement unix / linux:
dans le programme gnuplot: plot "/ dev / stdin" ...
En ligne de commande: gnuplot program.plot <data.dat
la source
Cette question a reçu une bonne réponse, mais je pense que je peux trouver un créneau à combler ici, ne serait-ce que pour réduire la charge de travail de quelqu'un qui cherche sur 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 je vais donc partager ma solution ici.
J'ai développé un script de tracé dans un environnement à jour qui m'a permis de faire:
Cela s'exécute parfaitement bien depuis la ligne de commande dans un environnement avec un gnuplot récent (5.0.3 dans mon cas).
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.
La combinaison de ces deux scripts permet de passer des paramètres des scripts bash aux scripts gnuplot sans tenir compte de la version de gnuplot et dans pratiquement n'importe quel * nix.
la source
Vous pouvez même faire de la magie de shell, par exemple comme ceci:
Mon implémentation est un peu plus complexe (ex: remplacement de quelques jetons magiques dans l'appel sed, alors que j'y suis déjà ...), mais j'ai simplifié cet exemple pour une meilleure compréhension. Vous pouvez également le rendre encore plus simple ... YMMV.
la source
Dans le shell, écrivez
et consécutivement les fichiers souhaités. -persist est utilisé pour faire en sorte que l'écran de gnuplot reste tant que l'utilisateur ne le quitte pas manuellement.
la source
gnuplot -persist -c "myscript.plt" "mydata.csv" "myoutput.png"
cette commande fonctionne bien et j'obtiens le fichier "myoutput.png" comme je m'y attendais, mais l'écran gnuplot n'apparaît pas (AUCUNEexit
commande dans myscript.plt). Pourquoi? Et comment faire apparaître l'écran gnuplot dans mon exemple?Encore une autre façon est la suivante:
Vous avez un script gnuplot nommé
scriptname.gp
:Vous pouvez maintenant appeler le script gnuplot
scriptname.gp
par cette paix de syntaxe alambiquée:la source
La réponse de @ vagoberto semble la meilleure à mon humble avis si vous avez besoin d'arguments de position , et j'ai une petite amélioration à ajouter.
suggestion de vagoberto:
qui est appelé par:
pour ces typeurs paresseux comme moi, on pourrait rendre le script exécutable (
chmod 755 script.gp
)puis utilisez ce qui suit:
et exécutez-le comme:
la source