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.
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
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. –
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