web-dev-qa-db-fra.com

canalisation des données de tracé vers le script gnuplot

Je veux créer un gnuplot avec trois parcelles. Les données doivent être en ligne (comme je veux seulement

Ça devrait ressembler à ça:

https://s22.postimg.cc/qcc94e1i9/test.png

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.

25
user524824

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.

25
Dan Stahlke

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'"
20
kirill_igum

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
13
SidR

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
12

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
2
smoebius