2015-04-30 25 views
7

Voglio fare qualcosa di simile a questa domanda: gnuplot : plotting data from multiple input files in a single graph.Stampa simultaneamente tutti i file in una directory con gnuplot?

Desidero stampare simultaneamente tutti i i file in una directory, senza dover scrivere esplicitamente i loro nomi. I numeri delle colonne sono gli stessi per tutti i file. Cosa posso fare?

Fare plot for [file in *] file u 3:2 non funziona.

Inoltre, non voglio che ogni file abbia una legenda diversa. Tutti i punti di tutti i file dovrebbero essere trattati allo stesso modo, come se provenissero tutti da un singolo file.

+0

Vedere ad es. http://stackoverflow.com/a/26682241/2604213 – Christoph

+0

@Christoph Grazie +1, questo risolve quasi il mio problema.Ho modificato la domanda, tuttavia, dal momento che non voglio che ogni file abbia una distinta leggenda. – becko

+0

Quale stile di stampa vuoi, hai bisogno di una legenda e su quale sistema operativo lavori? – Christoph

risposta

5

Si potrebbe provare qualcosa di simile:

a=system('a=`tempfile`;cat *.dat > $a;echo "$a"') 
plot a u 3:2 

Questo utilizza la riga di comando tempfile comando per creare un file temporaneo sicuro, unico nel suo genere, e getta. Mastica tutti i file di dati in questo file. Quindi echeggia il nome del file in modo che gnuplot possa recuperarlo. Gnuplot quindi traccia le cose.

Preoccupato per le linee di intestazione? Prova questo:

a=system('a=`tempfile`;cat *.dat | grep "^\s*[0-9]" > $a;echo "$a"') 

L'espressione regolare ^\s*[0-9] corrisponderà tutte le linee che iniziano con qualsiasi quantità di spazio bianco seguito da un numero.

+5

Non c'è bisogno di usare un file temporaneo, basta usare 'trama ' Christoph

+0

Bello, @Christoph! – Richard

2

Mi piace poter scegliere anche i file da stampare con i caratteri jolly, quindi se ti piace puoi farlo come segue, anche se ci sono molti modi. Crea il seguente script.

script.sh:

gnuplot -p << eof 
set term wxt size 1200,900 title 'plots' 
set logs 
set xlabel 'energy' 
plot for [ file in "[email protected]" ] file w l 
eof 

fare chmod u+x script.sh

Esegui come ./script.sh dir/* *.dat

Se avete bisogno spesso rendono un alias per esso e metterlo in un posto ragionevole :) Cin cin/J

5

In alternativa alla risposta di Jonatan, vorrei andare con

FILES = system("ls -1 *.dat") 
plot for [data in FILES] data u 1:2 w p pt 1 lt rgb 'black' notitle 

o

plot '<(cat *.dat)' u 3:2 title 'your data' 

La prima opzione ti dà più flessibilità, se si vuole etichettare ogni curva. Ad esempio, se si dispone di diversi file con nomi data_1.dat, data_2.dat, ecc, che saranno etichettati come 1, 2, ecc, quindi:

FILES = system("ls -1 data_*.dat") 
LABEL = system("ls -1 data_*.dat | sed -e 's/data_//' -e 's/.dat//'") 

plot for [i=1:words(FILES)] word(FILES,i) u 3:2 title word(LABEL,i) noenhanced 
0

Provate il seguente comando:

gnuplot -e 'plot for [file in system("find . -depth 1 -type f -print")] file u 3:2' 

Nota: aggiungere -p per mantenere la finestra del grafico.

Problemi correlati