2012-07-16 3 views
8

ich Datei dieses Format haben:Spalten Plotten ihre Header mit GnuPlot durch den Aufruf

x y1 y2 y3 ei1 ei2 ei3 es1 es2 es3 
1 4 5 4 7 7 2 4 7 7 
2 7 3 3 3 8 3 3 3 8 
3 2 1 4 4 9 6 4 4 9 

Ich möchte Plots erzeugen, ähnlich wie der folgende Befehl geben würde

plot "filename" using 1:2:5:8 with yerrorbars 

aber die Spalten mit Header (x, y1, ei1 und es1), um sie zu nennen. Wie kann das gemacht werden?

Seite 84 der gnuplot manual (die using Befehl Dokumentieren) lautet:

Height Weight Age 
val1 val1 val1 
... ... ... 

dann die folgenden Plot Befehle alle

plot ’datafile’ using 3:1, ’’ using 3:2 

plot ’datafile’ using (column("Age")):(column(1)), \ 
’’ using (column("Age")):(column(2)) 

plot ’datafile’ using "Age":"Height", ’’ using "Age":"Weight" 

jedoch äquivalent sind, wenn ich sie ich versuchte bekam nur die Zeilenindizes gegenüber sich selbst.

+3

'plotten" Dateiname "1: 2: 5: 8 mit yerrorbars' und' plot "Dateiname" using "x": "y1": "ei1": "es1" mit yerrorbars ergeben hier das gleiche Ergebnis. Welche Version von Gnuplot du ausführst, habe ich in gnuplot 4.6 patchlevel 0 getestet. – Thor

+0

Version 4.4 Patchlevel 3 wird mit Ubuntu ausgeliefert. Ist es zu alt? –

+1

Ja, Sie benötigen Version 4.6 oder höher für diese Funktion. – Thor

Antwort

5

Wenn Sie sich die Dokumentation zu gnuplot 4.4 vs. gnuplot 4.6 (aktuelle stabile Version) ansehen, scheint es, dass die Funktion, die Sie verwenden möchten, wahrscheinlich in gnuplot 4.5 eingeführt wurde (ungerade Zahlen sind die Entwicklungszweige - wenn sie gelten als stabil, werden sie auf eine gerade Zahl erhöht). Die einzige Möglichkeit, dies zu erreichen, besteht darin, ein einfaches Skript in einer anderen Sprache zu schreiben, die die Spaltennummer (in stdout) zurückgibt. Hier ist ein einfaches Beispiel mit Python, obwohl ich sicher bin, dass Sie dies in awk tun könnten, wenn Sie in einer All-POSIX-Umgebung bleiben wollen:

#python indexing is 0 based, gnuplot datafile indexing 1 based 
COL_AGE=`python -c 'print(open("datafile").readline().split().index("AGE")+1)'` 
COL_HEIGHT=`python -c 'print(open("datafile").readline().split().index("HEIGHT")+1)'` 
plot "datafile" u COL_AGE:COL_HEIGHT 

Dieses kleine Skript macht nichts Phantasie (Es nimmt die Spaltenüberschriften sind in der ersten Zeile zum Beispiel), aber die Macht der python verwenden, wäre es ziemlich einfach sein, um das Skript zu erweitern weiter:

#!/usr/bin/env python 
import sys 
with open(sys.argv[1]) as f 
    for line in f: 
     if (line.strip()): 
      print (line.split().index(sys.argv[2])+1) 
      sys.exit(0) 

Jetzt können Sie dieses Skript aufrufen als: python script.py datafile AGE, um herauszufinden, welche Spalte "AGE" ist in. Es ist ein Fehler, wenn "AGE" in keiner Spalte ist.