2012-06-27 15 views
7

Ich verwende die folgenden gnuplot Befehle ein Diagramm zu erstellen:gnuplot, wie man nur bestimmte Punkte beschriftet?

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

wo data_file wie folgt aussieht:

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 

ich gnuplot wollen beschriften alle Punkte mit den gefundenen Strings in Spalte 1, außer der eine, wo Spalte 4 ist gleich -3.60 In diesem Fall möchte ich die aaa stri ng. Was ich bekomme ist, dass der $4=-3.60 Datenpunkt richtig als aaa bezeichnet wird, aber der Rest wird nicht an allen beschriftet.


aktualisieren: gnuplot hat kein Problem zeigt Zahlen als Markierungen die bedingte Anweisung, das heißt: jede Spalte aber 1 korrekt als Etikett für jeden Punkt angezeigt Einhaltung der Bedingungen auferlegt. Das heißt, zeigt diese Zeile Spalte 2 (numbres) als Punktbezeichnungen die bedingte Anweisung zu respektieren:

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

Update 2: Es hat auch kein Problem in der Spalte 1 als Punktbezeichnungen Plotten, wenn ich es als ein plotten Ganze, dh nicht eine bedingte Anweisung verwenden. Das heißt, stellt diese Linie richtig alle die Punktbezeichnungen in Spalte 1 (Strings):

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

So klar ist das Problem zusammen mit den Saiten Spalte der bedingte Anweisung in Verwendung. Irgendwelche von diesen verwendeten getrennt funktioniert gut.

Antwort

5

In einer saubereren Weise vielleicht sollte dies funktionieren. Es scheint, dass Label eine berechnete Zahl nicht anzeigen kann, wenn sie nicht in einer Zeichenkette gedreht wird.

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

Diese Lösung funktioniert nicht für mich. Alles, was ich bekomme, ist ein einzelnes Label ('aaa'), das die eine Bezeichnung darstellt, die das OP entfernen möchte ... 'sprintf ("% d ", $ 1)' funktioniert nur, wenn die Daten in Spalte 1 ganze Zahlen sind. doing 'sprintf ("% s ", $ 1)' funktioniert auch nicht. Fehle ich hier etwas? – mgilson

+0

Ich habe kein gnuplot um zu überprüfen, aber vielleicht ist es anders, wenn die erste Zeile der Spalte 1 keine Zahl enthält (in diesem Fall sollte das ganze Sprintf-Ding nicht benötigt werden). Ich gestehe, ich habe es auf einer Datendatei von mir versucht, und nicht genau auf der OP's ... Ich würde auch versuchen '(($ 4! = - 3.60)? ''. $ 1: 'aaa'' um String-Konvertierung nur zu erzwingen –

+0

Die folgenden Funktionen '($ 4 ne '-3.60'? stringcolumn (1): '')' (stringcolumn ist ein besserer Weg als die String-Verkettung), aber dieser Test ist sehr fragil, da er eine Zeichenkette ausführt Vergleich auf '-3.60' anstelle eines Gleitkommavergleichs (zB -3.6 wird immer noch eine Beschriftung darauf setzen. Das Problem hier ist, dass Gnuplot Zeichenketten in diesem Feld erwartet, da gnuplot Zeichenketten darstellt Die beste Lösung ist die, die ich unten vorstelle (IMHO) - verschiebe einfach den Filter und es funktioniert gut – mgilson

3

Wollen Sie das?

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

Alles, was ich hier tue gesetzt ist (x) Punkte, an denen die Spalte 4 -3,6 bis NaN gleich (1/0). Da gnuplot diese Punkte ignoriert, ist das Leben gut. Ich denke, das Problem mit Ihrem Skript ist, dass Sie eine Spalte filtern, in der Gnuplot String-Eingabe erwartet - obwohl ich nicht genug damit herumgespielt habe, um das zu überprüfen. Ich habe den Filter einfach auf eine Spalte umgestellt, wo gnuplot Zahlen erwartet (die x-Position) und es funktioniert ganz gut.

+0

Yesss! Vielen Dank, ich hatte keine Ideen mehr, um es zu versuchen. Prost! – Gabriel

+1

@Gaba_p - Froh, zu helfen. Behalte (gnu) Plotten! :) – mgilson