les données du tracé de la conduite au script gnuplot

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

il devrait ressembler à ceci:

/images/content/17543386/90bfe1739eb2c100cee85733990aa312.png

actuellement, j'utilise le script gnuplot suivant pour créer le scénario:

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 faire passer les données.txt dans gnuplot et ne pas compter sur les 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 un fichier plot.gnu pour chacun d'eux.

j'ai lu à propos de la spéciale '-' fichier dans ce fil stackoverflow et j'ai lu à propos de parcelles multiples dans un fichier . Toutefois, cela nécessiterait d'inclure les données avec gnuplot code, ce qui n'est pas propre.

22
demandé sur Cœur 2013-07-09 12:23:48

6 réponses

si vous êtes sur un système Unix (C'est-à-dire Pas Windows), vous pouvez utiliser '<cat' au lieu de '-' pour lire à partir de stdin:

plot '<cat' using ...

alors vous pouvez faire cat data.txt | gnuplot script.gp . Cependant, dans le cas précis que vous mentionnez dans votre question, avec le tracé dans la boucle for, vous lisez l'entrée trois fois. Ainsi, l'envoi des données par l'intermédiaire de stdin n'est pas approprié, puisque les données disparaîtront après la première lecture.

23
répondu Dan Stahlke 2013-07-10 16:58:29

n'est pas une réponse directe, mais c'est ce que j'ai utiliser pour trouver rapidement les données. il est particulièrement utile avec la commande cut 151930920"

cat data.txt | cut -f2 -d' ' | gnuplot -p -e "plot '<cat'"
17
répondu kirill_igum 2015-06-26 18:57:23

Qu'y a-t-il de mal à utiliser l'option-e de Gnuplot de shell? Vous pouvez fournir une variable comme entrée, par exemple des données.txt, de shell à l'aide de:

gnuplot -e "filename='data.txt';ofilename='test.png'" plot.gnu

vous devriez être en mesure d'appeler la commande ci-dessus plusieurs fois avec des valeurs différentes pour" nom de fichier " de shell en utilisant une boucle pour.

et puis vous changez votre scénario.gnu à:

set terminal png
set output ofilename
plot for[col=2:4] filename using 1:col title columnheader(col) with lines
11
répondu SidR 2013-07-09 12:12:49

si vous voulez tracer des données provenant d'une pipe plus d'une fois, vous devez les stocker d'une façon ou d'une autre en mémoire. Ma méthode 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 vos données.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
11
répondu Giancarlo Sportelli 2015-10-13 17:26:20

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
répondu smoebius 2014-01-07 14:20:33

mélanger les deux réponses:

cat data.txt | gnuplot -e "set terminal png; set output "test.png"; plot for[col=2:4] '<cat' using 1:col title columnheader(col) with lines
-2
répondu user1264274 2013-11-22 10:06:19