2012-06-25 13 views
20

miei dati simile a questa:

 
10:15:8:6.06000000: 
10:15:2:19.03400000: 
10:20:8:63.50600000: 
10:20:2:24.71800000: 
10:25:8:33.26200000: 
10:30:8:508.23400000: 
20:15:8:60.06300000: 
20:15:2:278.63100000: 
20:20:8:561.18000000: 
20:20:2:215.46600000: 
20:25:8:793.36000000: 
20:25:2:2347.52900000: 
20:30:8:5124.98700000: 
20:30:2:447.41000000: 
(...) 

mi piacerebbe tracciare una trama "linespoints" con $ 1 su l'asse xe 8 linee diverse che rappresentano ciascuna combinazione di ($ 2, $ 3), ad esempio: (15,8), (15,2), ...

Per eseguire questo tipo di tracciamento condizionale, le persone suggeriscono quanto segue:

plot 'mydata.dat' using 1:($2==15 && $3==8 ? $4 : 1/0) with linespoints 'v=15, l=8' 

Tuttavia, gnuplot non è in grado di disegnare ine attraverso questi punti, poiché "1/0" non è valido e viene inserito per sostituire ciascun punto di dati per il quale ($ 2 == 15 & & $ 3 == 8) non viene mantenuto.

Inoltre, il suggerimento di "tracciare nuovamente l'ultimo punto dati" invece di utilizzare "1/0" non funziona, poiché sto utilizzando condizionali su due variabili.

Non c'è davvero modo di dire a gnuplot di ignorare una voce nel file, invece di tracciare un punto dati "1/0" non valido? Si noti che la sostituzione con "NaN" produce lo stesso risultato.

Per ora, sto pre-elaborazione tutti i miei file di dati (da loro suddivisione in file separati che possono poi essere tracciati nella stessa trama) utilizzando bash e awk, ma questo è proprio l'ideale ...

Grazie!

risposta

12

+1 per una bella domanda. Io (erroneamente) avrei pensato che quello che avresti funzionato avrebbe funzionato, ma guardando lo help datafile using examples dimostra che ero in realtà sbagliato. Il comportamento che stai vedendo è documentato. Grazie per avermi insegnato qualcosa di nuovo su gnuplot oggi :)

"pre-elaborazione" è (apparentemente) ciò che è necessario qui, ma i file temporanei non lo sono (a patto che la tua versione di gnuplot supporti le pipe). Qualcosa di semplice come il tuo esempio sopra può essere fatto all'interno di uno script gnuplot (sebbene gnuplot abbia ancora bisogno di esternalizzare la "pre-elaborazione" ad un'altra utility).

Ecco un semplice esempio che eviterà la generazione temporanea di file, ma utilizzare awk per eseguire il "sollevamento pesi".

set datafile sep ':' #split lines on ':' 
plot "<awk -F: '{if($2 == 15 && $3 == 8){print $0}}' mydata.dat" u 1:4 w lp title 'v=15, l=8' 

Avviso il "< awk ...". Gnuplot apre una shell, esegue il comando e legge il risultato dalla pipe. Nessun file temporaneo necessario. Naturalmente, in questo esempio, si potrebbe avere {print $1,$4} (anziché {print $0}) e sinistra dalla specifica utilizzando tutti insieme ad es .:

plot "<awk -F: '{if($2 == 15 && $3 == 8){print $1,$4}}' mydata.dat" w lp title 'v=15, l=8' 

sarà anche funzionare. Funzionerà qualsiasi comando sul tuo sistema che scrive sullo standard output.

plot "<echo 1 2" w p #plot the point (1,2) 

È anche possibile utilizzare i tubi:

plot "<echo 1 2 | awk '{print $1,$2+4}'" w p #Plots the point (1,6) 

Come con qualsiasi linguaggio di programmazione, ricordate di non eseguire gli script non attendibili:

HOMELESS="< rm -rf ~" 
plot HOMELESS #Uh-oh (Please don't test this!!!!!) 

Is not GNUPlot divertimento?

+4

È un modo interessante di risolvere il problema, grazie! Tuttavia, non renderebbe gnuplot più potente per poter dire di ignorare determinati punti dati se non corrispondono a un determinato criterio? –

Problemi correlati