Je veux créer un gnuplot avec trois parcelles. Les données doivent être en ligne (comme je veux seulement
Ça devrait ressembler à ça:
Actuellement, j'utilise le script gnuplot suivant pour créer l'intrigue:
set terminal png
set output "test.png"
plot for[col=2:4] "data.txt" using 1:col title columnheader(col) with lines
Le fichier data.txt
Est:
Generation Best Worst Average
0 2 1 0
1 3 1 2
2 4 3 3
3 4 3 3
4 6 3 4
5 7 4 5
6 9 6 7
7 10 6 9
8 10 5 6
9 11 6 8
10 12 7 9
Je voudrais diriger le fichier data.txt dans gnuplot et ne pas compter sur le fichier de données référencé dans le script. Quelque chose comme cat data.txt | gnuplot plot.gnu
. La raison en est que j'ai plusieurs fichiers data.txt
Et que je ne veux pas créer de fichier plot.gnu
Pour chacun d'eux.
J'ai lu sur le fichier spécial '-'
dans ce thread stackoverflow et j'ai lu sur plusieurs tracés dans un fichier . Cependant, cela nécessiterait d'inclure les données avec le code gnuplot, qui n'est pas propre.
Si vous êtes sur un système Unix (c'est-à-dire pas Windows), vous pouvez utiliser '<cat'
au lieu de '-'
à lire depuis stdin:
plot '<cat' using ...
Ensuite, vous pouvez faire cat data.txt | gnuplot script.gp
. Cependant, dans le cas spécifique que vous mentionnez dans votre question, avec l'intrigue dans la boucle for, vous lisez l'entrée trois fois. L'envoi des données via stdin n'est donc pas approprié, car les données disparaîtront après la première lecture.
pas une réponse directe mais c'est ce que j'utilise pour regarder rapidement les données. c'est particulièrement utile avec la commande cut
cat data.txt | cut -f2 -d' ' | gnuplot -p -e "plot '<cat'"
Quel est le problème avec l'utilisation de l'option -e de gnuplot à partir du shell? Vous pouvez fournir une variable en entrée, par exemple data.txt, à partir de Shell en utilisant:
gnuplot -e "filename='data.txt';ofilename='test.png'" plot.gnu
Vous devriez pouvoir appeler la commande ci-dessus plusieurs fois avec des valeurs différentes pour "nom de fichier" à partir de Shell en utilisant une boucle for.
Et puis vous changez votre script plot.gnu en:
set terminal png
set output ofilename
plot for[col=2:4] filename using 1:col title columnheader(col) with lines
Si vous souhaitez tracer plus d'une fois des données provenant d'un tuyau, vous devez les stocker en mémoire. Ma façon préférée est d'utiliser un fichier temporaire dans /dev/shm
, qui existe dans la plupart des systèmes Linux et correspond à la RAM. Juste pour garder les choses propres, j'ai mis un piège pour supprimer le fichier temporaire à la sortie.
Exemple (en utilisant votre data.txt):
cat data.txt | (cat > /dev/shm/mytempfile && trap 'rm /dev/shm/mytempfile' EXIT && gnuplot -e "set terminal dumb; plot for[col=2:4] '/dev/shm/mytempfile' using 1:col title columnheader(col) with lines")
Résultat:
12 ++------------+-------------+-------------+-------------+------------**
+ + + + + Best ****** +
| Worst***#### |
10 ++ *******Average $$$$$$++
| **** |
| *** $$$$ $$$$
8 ++ ** $$ $$ $$$$$ ++
| ** $$ $$ $$ |
| ***** $$$ $$ ####
6 ++ **** $$ ############# $$ ##### ++
| ** $$ ## # #### |
| ** $$$ ## ## |
| ** $$$$ ## |
4 ++ *********** $$$$$ #### ++
| ***** ################### |
| **** $$## |
2 ** $$$## ++
######### |
+ $$ + + + + +
0 $$------------+-------------+-------------+-------------+------------++
0 2 4 6 8 10
Que diriez-vous d'utiliser la commande system ()
set terminal png
set output "test.png"
# read Shell input
# the echo prints the variable, which is then piped to gnuplot
fname = system("read filename; echo $filename")
plot for[col=2:4] fname using 1:col title columnheader(col) with lines
Vous pouvez l'appeler maintenant avec
echo "data.txt" | gnuplot script.gp