2012-06-27 21 views
7

estoy usando los siguientes comandos gnuplot para crear una parcela:gnuplot, ¿cómo etiquetar solo ciertos puntos?

#!/bin/bash 
gnuplot << 'EOF' 
set term postscript portrait color enhanced 
set output 'out.ps' 

plot 'data_file' u 3:2 w points , '' u 3:2:($4!=-3.60 ? $1:'aaa') w labels 

EOF 

donde data_file se parece a esto:

O4  -1.20  -0.33  -5.20 
O9.5  -1.10  -0.30  -3.60 
    B0  -1.08  -0.30  -3.25 
B0.5  -1.00  -0.28  -2.60 
B1.5  -0.90  -0.25  -2.10 
B2.5  -0.80  -0.22  -1.50 
    B3  -0.69  -0.20  -1.10 

Quiero gnuplot para etiquetar todos los puntos con las cuerdas que se encuentran en la columna 1, excepto donde la columna 4 es igual a -3.60 en cuyo caso quiero el aaa stri ng. Lo que obtengo es que el punto de datos $4=-3.60 está etiquetado correctamente como aaa, pero el resto no está etiquetado en absoluto.


actualización: gnuplot no tiene ningún problema mostrando números como etiquetas utilizando la sentencia condicional, es decir: cualquier columna pero 1 se muestra correctamente como una etiqueta para cada punto respetando las condiciones impuestas. Es decir, esta línea muestra la columna 2 (numbres) como etiquetas de los puntos respetando la sentencia condicional:

plot 'data_file' u 3:2 w points , '' u 3:2:($4!=-3.60 ? $2:'aaa') w labels 

Actualización 2: También tiene ningún problema en el trazado de la columna 1 como etiquetas de puntos si trazo como un todo, es decir, sin usar una declaración condicional. Es decir, esta línea traza correctamente todos las etiquetas de los puntos en la columna 1 (cadenas):

plot 'data_file' u 3:2 w points , '' u 3:2:1 w labels 

Así que está claro que el problema es en el uso de la instrucción condicional juntos con la columna de cadenas. Cualquiera de estos usados ​​por separado funciona bien.

Respuesta

5

De una manera más limpia tal vez, esto debería funcionar. Parece que la etiqueta no puede mostrar un número calculado si no se convierte en una cadena.

#!/bin/bash 
gnuplot << 'EOF' 
set term postscript portrait color enhanced 
set output 'out.ps' 

plot 'data_file' u 3:2 w points , '' u 3:2:($4!=-3.60 ? sprintf("%d",$1):'aaa') w labels 

EOF 
+0

Esta solución no funciona para mí. Todo lo que obtengo es una sola etiqueta ('aaa') que representa la etiqueta que el OP quiere eliminar ... haciendo 'sprintf ("% d ", $ 1)' solo funciona si los datos en la columna 1 son enteros. hacer 'sprintf ("% s ", $ 1)' tampoco funciona. ¿Me estoy perdiendo de algo? – mgilson

+0

No tengo gnuplot para verificar, pero tal vez sea diferente si la primera línea de la columna 1 no contiene un número (en ese caso, no debería necesitar todo el sprintf). Confieso que lo probé en un archivo de datos, y no exactamente en el de OP ... También probaría '(($ 4! = - 3.60)? ''. $ 1: 'aaa'' para forzar solo la conversión de cadenas si es necesario. –

+0

Los siguientes trabajos '($ 4 ne '-3.60'? stringcolumn (1): '')' (stringcolumn es una mejor manera que usar la concatenación de cadenas), pero esta prueba es realmente bastante frágil ya que está haciendo una cadena comparación en '-3.60' en lugar de una comparación de flotación (por ejemplo, -3.6 todavía pondrá una etiqueta allí). El problema aquí es que dado que gnuplot está trazando etiquetas, está esperando cadenas en ese campo (convirtiendo la columna 4 en cadenas en de entrada, parece). Esto también deja esa cadena (vacía) en la salida que la infla. La mejor solución es la que propongo a continuación (en mi humilde opinión) - simplemente mueva el filtro y funciona bien – mgilson

3

¿Esto es lo que quieres?

#!/bin/bash 

gnuplot << 'EOF' 
set term postscript portrait color enhanced 
set output 'out.ps' 
plot 'data_file' u 3:2 w points , \ 
    '' u (($4 == -3.60)? 1/0 : $3):2:1 w labels 

EOF 

Todo lo que hago aquí se establece (x) puntos donde la columna 4 es igual a -3.6 a NaN (1/0). Como gnuplot ignora esos puntos, la vida es buena. Creo que el problema con su secuencia de comandos es que estaba filtrando una columna donde gnuplot espera la entrada de cadena, aunque no he jugado con ella lo suficiente como para verificarlo. Acabo de cambiar el filtro a una columna donde gnuplot espera números (la posición x) y funciona muy bien.

+0

Yesss! Muchas gracias, me había quedado sin ideas para probar. ¡Aclamaciones! – Gabriel

+1

@Gaba_p - Me alegra ayudar. mantener (gnu) conspirando! :) – mgilson

Cuestiones relacionadas