2013-07-09 13 views
20

Voglio creare un gnuplot con tre grafici in esso. I dati dovrebbero essere in linea (come io voglio solodati di trama del tubo per lo script gnuplot

Esso dovrebbe essere simile a questo:

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

Attualmente sto usando il seguente script gnuplot per creare la trama:

set terminal png 
set output "test.png" 
plot for[col=2:4] "data.txt" using 1:col title columnheader(col) with lines 

Il file data.txt è:

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 

Vorrei inserire pipe.txt in gnuplot e non fare affidamento sul file di dati di riferimento nello script. Qualcosa come cat data.txt | gnuplot plot.gnu. Il motivo è che ho diversi file data.txt e non voglio creare un file plot.gnu per ognuno di questi.

Ho letto dello speciale '-' file in this stackoverflow thread e ho letto su multiple plots in one file. Tuttavia questo richiederebbe di includere i dati con il codice gnuplot, che non è pulito.

+0

Si può scommettere, a risolvere qualche problema di ottimizzazione con l'algoritmo basato sulla popolazione;) –

risposta

11

Cosa c'è di sbagliato nell'usare l'opzione -e di gnuplot dalla shell? È possibile fornire una variabile come input, dire data.txt, da shell utilizzando:

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

Si dovrebbe essere in grado di chiamare il comando precedente più volte con valori diversi per "file" da shell utilizzando un ciclo.

E poi si cambia plot.gnu script:

set terminal png 
set output ofilename 
plot for[col=2:4] filename using 1:col title columnheader(col) with lines 
+0

Grande risposta, non hanno riconosciuto il comando '-e' ancora! –

21

Se siete su un sistema Unix (cioè non Windows) è possibile utilizzare '<cat' invece di '-' di leggere da stdin:

plot '<cat' using ... 

Quindi è possibile eseguire cat data.txt | gnuplot script.gp. Tuttavia, nel caso specifico menzionato nella tua domanda, con la trama nel ciclo for, leggi l'input tre volte. Pertanto, l'invio dei dati tramite stdin non è appropriato, poiché i dati verranno eliminati dopo la prima lettura.

-2

Mix entrambe le risposte:

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 
+1

Questo non funziona, poiché la lettura da stdin non può essere combinata con un ciclo for in gnuplot. Vedi http://stackoverflow.com/questions/4981279/how-to-make-several-plots-from-the-same-standard-input-data-in-gnuplot per soluzioni alternative. – ramn

2

ne dite di usare il comando() il sistema

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 

si può chiamare ora con

echo "data.txt" | gnuplot script.gp 
15

non una risposta diretta, ma questo è quello che uso per esaminare rapidamente i dati. è particolarmente utile con il comando di cut

cat data.txt | cut -f2 -d' ' | gnuplot -p -e "plot '<cat'" 
10

Se si desidera tracciare i dati provenienti da un tubo più di una volta, è necessario memorizzare in qualche modo nella memoria. Il mio modo preferito è quello di utilizzare un file temporaneo in /dev/shm, che esiste nella maggior parte dei sistemi Linux e mappa in RAM.Solo per mantenere le cose pulite, ho impostato una trappola per eliminare il file temporaneo all'uscita.

Esempio (usando il vostro 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") 

Risultato:

12 ++------------+-------------+-------------+-------------+------------** 
    +    +    +    +    + Best ****** + 
    |              Worst***#### | 
10 ++            *******Average $$$$$$++ 
    |           ****      | 
    |          *** $$$$    $$$$ 
8 ++          **  $$ $$  $$$$$ ++ 
    |         **  $$  $$ $$  | 
    |        ***** $$$    $$  #### 
6 ++       ****  $$ ############# $$ ##### ++ 
    |       **   $$ ##    # ####  | 
    |      **  $$$ ##    ##   | 
    |      **  $$$$ ##        | 
4 ++   *********** $$$$$ ####         ++ 
    |  ***** ###################          | 
    | **** $$##               | 
2 ** $$$##               ++ 
    #########                | 
    + $$   +    +    +    +    + 
0 $$------------+-------------+-------------+-------------+------------++ 
    0    2    4    6    8    10 
Problemi correlati