2012-06-25 18 views
20

Mis datos es el siguiente:

 
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: 
(...) 

me gustaría trazar una parcela "linespoints" con $ 1 en la el eje xy 8 líneas diferentes que representan cada combinación de ($ 2, $ 3), por ejemplo: (15,8), (15,2), ...

Para hacer este tipo de trazado condicional, la gente sugiere lo siguiente:

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

Sin embargo, gnuplot no puede dibujar al ine a través de estos puntos, ya que "1/0" no es válido y se inserta para reemplazar cada punto de datos para el cual ($ 2 == 15 & & $ 3 == 8) no se cumple.

Además, la sugerencia de "trazar el último punto de datos nuevamente" en lugar de usar "1/0" no funciona, ya que estoy usando condicionales en dos variables.

¿Realmente no hay forma de decirle a gnuplot que ignore una entrada en el archivo, en lugar de trazar un punto de datos "1/0" no válido? Tenga en cuenta que reemplazarlo por "NaN" produce el mismo resultado.

Por ahora, estoy preprocesamiento todos mis archivos de datos (de dividir en archivos separados que luego se pueden representar en la misma parcela) usando bash y awk, pero esto es menos que ideal ...

¡Gracias!

Respuesta

12

+1 para una gran pregunta. Yo (erróneamente) habría pensado que lo que tenía funcionaría, pero mirar help datafile using examples muestra que de hecho estaba equivocado. El comportamiento que estás viendo está documentado. Gracias por enseñarme algo nuevo sobre gnuplot hoy :)

"preprocesamiento" es (aparentemente) lo que se necesita aquí, pero los archivos temporales no lo son (siempre y cuando su versión de gnuplot admita tuberías). Algo tan simple como su ejemplo anterior se puede hacer dentro de una secuencia de comandos gnuplot (aunque gnuplot todavía necesitará subcontratar el "preprocesamiento" a otra utilidad).

Aquí hay un ejemplo simple que evitará la generación temporal de archivos, pero use awk para hacer el "trabajo pesado".

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' 

Aviso del "< awk ...". Gnuplot abre un shell, ejecuta el comando y lee el resultado de la tubería. No se necesitan archivos temporales. Por supuesto, en este ejemplo, podríamos tener {print $1,$4} (en lugar de {print $0}) y dejado fuera de la especificación utilizando todos juntos ej .:

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

también funcionará. Cualquier comando en su sistema que escriba en salida estándar funcionará.

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

Usted puede incluso utilizar tuberías:

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

Como con cualquier lenguaje de programación, recuerde que no debe ejecutar secuencias de comandos que no se confía:

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

No está GNUPlot divertido?

+4

Esa es una forma interesante de solucionar el problema, ¡gracias! Sin embargo, ¿no haría Gnuplot mucho más poderoso poder decirle que ignore ciertos puntos de datos si no coinciden con un determinado criterio? –

Cuestiones relacionadas