2012-06-27 14 views
7

Sto utilizzando i seguenti gnuplot comandi per creare una trama:gnuplot, come etichettare solo determinati punti?

#!/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 

dove data_file assomiglia a questo:

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 

voglio gnuplot per etichettare tutti punti con le stringhe trovate nella colonna 1, eccetto quello in cui la colonna 4 è uguale a -3.60 nel qual caso voglio lo spacco aaa ng. Quello che sto ottenendo è che il punto di dati $4=-3.60 viene etichettato correttamente come aaa, ma il resto non sono stati etichettati per tutto.


Aggiornamento: gnuplot non ha alcun problema mostrando numeri come etichette utilizzando il condizionale, vale a dire: una colonna ma 1 viene visualizzato correttamente come etichetta per ogni punto nel rispetto delle condizioni imposte. Cioè, questa linea mostra delle colonne 2 (numbres) come etichette punti rispetto l'istruzione condizionale:

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

Update 2: Essa ha anche un problema nel tracciare colonna 1 come etichette dei punti se io tracciare come un intero, ovvero non utilizzando un'istruzione condizionale. Cioè, questa linea traccia correttamente tutti le etichette dei punti nella colonna 1 (stringhe):

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

Quindi chiaramente il problema è nella utilizzando l'istruzione condizionale insieme con la colonna corde. Ognuno di questi usato separatamente funziona bene.

risposta

5

In un modo più pulito forse, questo dovrebbe funzionare. Sembra che l'etichetta non possa visualizzare un numero calcolato se non viene trasformato in una stringa.

#!/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

Questa soluzione non funziona per me. Tutto quello che ottengo è una singola etichetta ('aaa') che rappresenta l'etichetta che l'OP vuole essere rimossa ... facendo 'sprintf ("% d ", $ 1)' funziona solo se i dati nella colonna 1 sono interi. anche fare 'sprintf ("% s ", $ 1)' non funziona. Mi sto perdendo qualcosa qui? – mgilson

+0

Non ho gnuplot in giro da controllare, ma forse è diverso se la prima riga della colonna 1 non contiene un numero (in tal caso l'intera cosa sprintf non dovrebbe essere necessaria). Confesso di averlo provato su un mio file di dati, e non esattamente su quello dell'OP ... Vorrei anche provare '(($ 4! = - 3.60)? '. $ 1:' aaa'' per forzare solo la conversione di stringhe –

+0

Il seguente funziona '($ 4 ne '-3.60'? stringcolumn (1): '')' (stringcolumn è un modo migliore di usare la concatenazione di stringhe), ma questo test è davvero piuttosto fragile dato che sta facendo una stringa confronto su '-3.60' invece di un confronto float. (ad esempio -3,6 inserirà comunque un'etichetta). Il problema qui è che poiché gnuplot sta plottando le etichette, è in attesa di stringhe in quel campo (convertendo la colonna 4 in stringhe su input sembra). Questo lascia anche quella stringa (vuota) nell'output che la gonfia.La soluzione migliore è quella che propongo di seguito (IMHO) - basta spostare il filtro e funziona bene – mgilson

3

È questo quello che vuoi?

#!/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 

Tutto ciò che faccio qui è impostato (x) i punti in cui la colonna 4 è uguale a -3.6 per NaN (1/0). Dato che gnuplot ignora quei punti, la vita è buona. Penso che il problema con il tuo script sia che stavi filtrando una colonna in cui gnuplot si aspetta input di stringa - anche se non ho giocato abbastanza con esso per verificarlo. Ho appena cambiato il filtro in una colonna in cui gnuplot si aspetta dei numeri (la posizione x) e funziona perfettamente.

+0

Sì! Grazie mille, ho avuto a corto di idee per provare. Saluti! – Gabriel

+1

@Gaba_p - Felice di aiutare. tieni traccia (gnu)! :) – mgilson