2016-07-29 6 views
3

Ich habe folgende Art von Datei:mehr Datensätze in der gleichen Datendatei in gnuplot

<string1> <x1> <y1> 
<string2> <x2> <y2> 
... 

Ich mag ein Streudiagramm von den (x, y) Werten ziehen, in der zunächst die verschiedenen Saiten Spalte in verschiedenen Datensätzen, die mit verschiedenen Farben gezeichnet werden (ich habe viele verschiedene x, y-Werte, aber nur ein paar verschiedene Strings). Ich habe das versucht:

Leider wählt dieser die erste Spalte für die erste Zeile und verwendet das als Titel für alle Einträge.

Antwort

0

könnten Sie awk verwenden nur die Zeilen zu holen, wo die erste Spalte die Saiten passt:

plot "<awk '$1~/string1/' DATAFILE" using 2:3 title column(1),\ 
    "<awk '$1~/string2/' DATAFILE" using 2:3 title column(1) 

und so weiter. Für eine integrierte in gnuplot-Lösung können Sie tun:

plot "DATAFILE" u 2:(stringcolumn(1) eq "string1" ? $3:1/0),\ 
    "DATAFILE" u 2:(stringcolumn(1) eq "string2" ? $3:1/0) 

, wenn Sie etwas mehr automatische tun wollen, die Grundstücke für jeden eindeutigen Eintrag in der Spalte 1 ist diese Lösung für mich gearbeitet erzeugen würde:

Eingang Datei (test.dat - getrennt, sonst müssen cut Erklärung unten ändern):

one 1 3 
two 2 4 
ten 3 5 
ten 4 3 
two 5 4 
one 6 5 
one 7 3 
ten 8 4 
two 9 5 
ten 10 3 
two 11 4 
one 12 5 

die folgende Zeile erstellt eine Plotten Anweisung für gnuplot und speichert in einer Datei:

cut -f1 test.dat | sort -u | awk ' 
BEGIN {print "plot\\"} 
{print "\"test.dat\" u 2:(stringcolumn(1) eq \""$1"\" ?\$3:1/0),\\"}' > plot.gp 

und die Inhalte sind:

plot\ 
"test.dat" u 2:(stringcolumn(1) eq "one" ?$3:1/0),\ 
"test.dat" u 2:(stringcolumn(1) eq "ten" ?$3:1/0),\ 
"test.dat" u 2:(stringcolumn(1) eq "two" ?$3:1/0),\ 

dann würden Sie tun:

gnuplot plot.gp 

oder die Linie load "plot.gp" zu Ihrem Skript hinzufügen.

Ich bin mir ziemlich sicher, dass es eine "gnuplot-only" Lösung geben muss, aber das geht über mein Wissen hinaus. Hoffe das hilft.

+0

Ist es möglich, alle Strings zu drucken, auch wenn ich nicht weiß, was sie eigentlich sein? – petersohn

+0

Ja, sicher. Ich habe meine Antwort mit einer möglichen Lösung bearbeitet. –

0

Sie haben nur eine Handlung, also nur einen Titel.

Wenn Sie separat alle Datensätze darstellen möchten (getrennt durch zwei aufeinanderfolgende Leerzeilen), Sie (nur) müssen so sagen:

N_datasets=3 
plot for [i=0:N_datasets-1] "file.dat" using 2:3 index i with title columnhead(1) 

Aber die Formatierung der Daten-Datei ist nicht das, was gnuplot erwartet und die Verwendung von title columnhead überspringt auch die erste Zeile (von der angenommen wird, dass sie nur Header enthält). Das Standard-gnuplot-Format hierfür sei:

string1 
x1_1 y1_1 
x1_2 y1_2 
... 


string2 
x2_1 y2_1 
x2_2 y2_2 
... 
Verwandte Themen