Flashplayer downloaden? Logo Meeresgeologie Online ... zur Startseite
Schrift kleiner | grösser 

Online-Nachschlagewerk zur Meeresforschung
Herausgeber: Dr. D. Völker

Daten darstellen mit Gnuplot

Autor: Dr. David Voelker

Gnuplot ist ein kommandozeilen-orientiertes, interaktives wissenschaftliches Plotprogramm. Es ist umsonst, nimmt nicht viel Platz weg und macht all das, was man braucht, um Daten schnell darzustellen: Gnuplot kann sowohl Kurven (x/y-Datenpaare) als auch 3D-Objekte (Flächen) abbilden.

Gnuplot läuft unter der GNU General Public License, ist also umsonst und wird als frei veränderbarer Programmcode verteilt. Mit wgnuplot gibt es eine für Windows aufbereitete Version mit Benutzeroberfläche.

Was kann Gnuplot - nicht ?

Mit Gnuplot lassen sich Funktionen und Messwerte in einem karthesischen Koordinatensystem oder in einem 3D-Raum darstellen. Flächen werden als Netzgittermodell im Raum dargestellt oder als Konturlinien in die Ebene projeziert. Die Kurven und Achsen können mit Markierung, Überschriften, Datums-und Zeitangaben versehen werden. Zusätzlich können Interpolationen durchgeführt werden. Zusätzlich zum üblichen karthesischen Koordinatensystem kennt Gnuplot auch polare Koordinatensysteme.

3D-Interpolation (gridding) zwischen unregelmäßig verteilten Datenpunkten ist mit einem einfachen Gewichtungsverfahren möglich, andere Programme (z.B. Surfer) bieten in dieser Hinsicht mehr Möglichkeiten, aber für viele Ansprüche dürfte es bereits genügen.

Wie funktioniert Gnuplot?

Gnuplot ist ein kommandozeilen-orientiertes, interaktives Programm, d.h. beim Aufruf erscheint ein Kommandofenster, das eine Eingabe verlangt, z.B. einen der Plotbefehle oder die Definion einer Funktion. Ist eine Eingabe erfolgt, wird sie ausgeführt, was man entweder sofort merkt (bei einem Plotbefehl) oder sich später auf folgende Plotbefehle auswirkt.

gnuplot> a=0.25
gnuplot> f(x)=sin(x)*a
gnuplot> plot f(x)

Diese Befehlsabfolge (jeweils mit einem ENTER abgeschlossen) hätte das folgende Resultat:

Praktischerweise wird man diese Befehlsfolgen in eine Stapeldatei (eine einfache Textdatei, in Folgenden einfach plt-Datei genannt) schreiben, die dann aufgerufen werden kann.

Voreinstellungen

Es gelten schon einige vordefinierte Standard-Einstellungen über den Stil der Abbildung. Angezeigt werden die gültigen Einstellungen mit dem Befehl show all. Die Grundeinstellungen stehen in einer Datei namens .gnuplot (UNIX, LINUX), bzw. GNUPLOT.INI(Windows). Diese defaults kann man natürlich überschreiben. Der prinzipielle Befehl, um Änderungen an Achsen, Label, Wertebereiche etc. vorzunehmen lautet set. Eine Änderung wirkt sich solange aus, bis man die Einstellungen neu festgelegt hat. Mit reset kehrt man zu den Standardeinstellungen zuück.

Wichtige Gnuplot-Befehle

Im Folgenden werden einzelne wichtige Befehle und Funktionen vorgestellt und illustriert. Zu jedem der Befehle existiert eine Beschreibung, die mit dem Befehl help abfragen kann.

Variablen und Funktionen definieren, Achsen formatieren

# Einfacher Polynom 03/02
#==========================================
set xrange [-5:10]
set yrange [-150:250]
a=0.7
b=-2.0
c=-25
f(x)=a*x**3+b*x**2+c*x-12
plot f(x)

gnuplot-Beispiel 2

Erläuterung

Zunächst einmal werden die darzustellenden Achsenbereiche festgelegt: x von -5 bis 10, y von -150 bis 250, dann werden einige Variablen definiert, die dann später in der Funktionsdefinition wieder aufgegriffen werden. Der Plot-Befehl plot f(x) stellt die Funktion dar.

Daten plotten, Achsen beschriften

# Plotten von gemessenen Daten 03/02
#====================================
set title 'NaCl-Konzentrationen entlang Profil 17b'
set yrange [0:600]
set xrange [2:17] set xlabel 'Entfernung [km]'
set ylabel 'Konzentration [ppm]'
plot 'Nacl_17b.dat' using 1:2 with points

Erläuterung

Mit set title wurde die Grafik, mit set xlabel und set ylabel die Achsen beschriftet. Im Unterschied zum vorigen Beispiel wird hier keine Funktion dargestellt, sondern gemessene Daten, die aus einer Datei (Nacl_17b.dat) bezogen werden. Es handelt sich um eine einfache Textdatei, in der die x/y-Wertepaare (Konzentration gegen Entfernung) als zwei Spalten (getrennt je durch ein paar Leerzeichen) stehen. So etwas könnte z.B. eine aus EXCEL exportierte Datei sein. Man kann einzelne Spalten einer Datei gegeneinander darstellen (z.B. 3. Spalte =x, 1. Spalte = y) durch den Zusatz using 3:1 Diese Anwendung beeinhaltet noch weitere Möglichkeiten:

plot 'datenfile.dat' using 1:($4>5 ? $4 :1/0) - Datenclipping: plotte Spalte 1 (x) gegen Spalte 4 (y), wenn y>5

plot 'datenfile.dat' using 1:($4*(-1)) - Berechnen der Spalten: plotte Spalte 1 (x) gegen Spalte 4(y), multipliziert mit -1

Die Daten sollen nicht verbunden werden, sondern als Punkte dargestellt werden, daher das Zauberwort with der den plot-Befehl mit einem STYLE verbindet (für genauere Angaben betätigen Sie help plot).

Mehrere Datensätze plotten, logarithmisches Achsenformat

# Plotten von berechneten Daten 03/02
#====================================
set title 'Kriechfestigkeit der Kruste'
set yrange [-30000:0]
set xrange [1e5:1e11]
set logscale x
set pointsize 0.5
set grid
set xlabel 'Differenzspannung [Pa]'
set ylabel 'Teufe [m]'
plot 'creep_qz.dat' title "Quarz" with points, \
'creep_halit.dat' title "Halit" with points, \
'creep_granit.dat' title "Granit" with points

Gnuplot-Beispiel 3

Erläuterung

Mit set title wurde die Grafik beschriftet, mit set grid ein Gitternetz gelegt und mit set logscale x die x-Achse logarithmisch unterteilt, um den großen Werteberich der Daten darstellen zu können. Wie im vorherigen Beispiel werden die Daten aus Dateien bezogen (creep_qz.dat, creep_halit.dat und creep_granit.dat). Um sie in denselben Grafen zu plotten werden sie mit einem Komma aneinander gehängt. Die Dateien sind wiederum schlichte Textdateien mit 2 Spalten für x und y -Werte.

Polynom an Daten anpassen (least squares fit)

# least squares fit an gemessenen Daten 03/02
#============================================
set title 'NaCl-Konzentrationen entlang Profil 17b'
set yrange [0:600]
set xrange [2:17]
set xlabel 'Entfernung [km]'
set ylabel 'Konzentration [ppm]'
f(x)=a*x**3+b*x**2+c*x+d
fit f(x) 'Nacl_17b.dat' via a, b, c, d
plot 'Nacl_17b.dat' with points, f(x)

Gnuplot-Beispiel 5

Erläuterung

Diesmal etwas ganz anderes: Häufig wollen wir eine Funktion durch eine Wolke von Messergebnissen legen, da der Verdacht besteht, daß die Messgrößen in irgendeiner Form voneinander abhängig sind. Mit Gnuplot können wir den Polynom finden, der am besten durch die Punktwolke passt (least squares fit). Wir geben eine Funktion vor, z.B. f(x)=a*x**3+b*x**2+c*x+d (Polynom 3. Grades) und wollen die Werte von a, b, c und d erhalten für die das eben genannte Kriterium gilt. Der Befehl heißt fit. Anschließend können wir noch Datenpunkte und Kurve übereinander plotten.

3D-Plot von Datensatz

3D-Darstellung 03/02
#==========================================
set xrange [-49.28:-49.13]
set yrange [12.05:12.20]
set zrange [-5000:-3750]
set view 45,20,1.0,2.5
splot 'topo.xyz'

Gnuplot-Beispiel 6

Erläuterung

Der Schritt in die 3.Dimension ist nicht schwer: zusätzlich muss ein Wertebereich der z-Achse festgelegt werden (set zrange), sowie ein Blickwinkel und -höhe (Azimuth & Elevation mit set view). Statt plot heißt der Befehl nun splot. Die Datenpunkte werden einer Datei entnommen (topo.xyz) bei der es sich wiederum um eine Textdatei mit 3 Spalten für x- y- und z-Werte handelt.

3D-Plot einer Funktion mit Gitternetzlinien

set hidden3d
set isosamples 40
set xrange [-2.5:2.5]
set yrange [-2.5:2.5]
set zrange [0.0:5.0]
set xtics 0.5
set ytics 1.0
set ztics 0.5
set view 40,50,1.0,1.5
f(x,y)=(x**2+2.5*y**2-y)*exp(1-(x**2+y**2))
splot f(x,y)

Gnuplot-Beispiel 8

Erläuterung

Anstelle von Meßwerten können 3-dimensionale Funktionen f(x;y) als Flächen im Raum dargestellt werden. Dazu müssen die Achsenbereiche von x-, y- und z-Achse festgelegt werden (z.B. set zrange), sowie ein Blickwinkel und -höhe (Azimuth & Elevation mit set view, hier 40° und 50°). Nachdem die Funktion definiert wurde, kann sie direkt dem Befehl splot übergeben werden. Da hier keine diskreten Werte vorliegen, braucht es noch eine Angabe darüber, wie dicht die Gitternetzlinien gesetzt werden sollen (set isosamples). Um den 3D-Effekt zu erhalten, können verdeckte Liniensegmente (die, welche man nicht sehen würde) ausgeblendet werden (set hidden3D)

Gridding und Konturieren von unregelmäßig verteilten Datenpunkten

set data style lines
set contour base
set surface
set xrange [-5:400]
set yrange [0:510]
set zrange [-20:70]
set view 50,10,1.0,1.0
set dgrid3d 40,51,3
show contour
splot 'surface.xyz'

Gnuplot-Beispiel 9

Erläuterung

Ein Datensatz (einfache 3-spaltige Tabelle) mit unregelmäßig verteilten Datenpunkten (scattered data, hier die Datei surface.xyz) soll als Netzgitter-Oberfläche und als Konturlinie (projeziert auf die Grundfäche) dargestellt werden. Dafür müssen zunächst durch Interpolation die Lücken gefüllt und ein equidistantes Netz von Datenpunkten geschaffen werden (gridding). Das Verfahren besteht darin, daß jeder Datenpunkt in Bezug auf einen Gitterpunkt zu dessen Wert beiträgt und zwar gewichtet nach seiner Entfernung zu diesem und einem Gewichtungsfaktor. Das Gridden des Datensatz erfolgt mit dem Befehl dgrid3d. Der Befehl braucht als Angabe die Anzahl von Intervallen in x-Richtung und y-Richtung (hier: 40 und 51), die den Grid ausmachen und einen Gewichtungsfaktor (dazu unten mehr).

Beim Gridden sollte man sich dessen bewußt sein, was man tut: aus ein paar vorhandenen Datenpunkten wird eine ganze Welt errechnet! Man interpoliert Lücken, indem man annimmt, daß die Punkte in der Nähe von Messwerten sich so ähnlich wie diese verhalten. Der Grid kann natürlich nur so gut sein, wie die Datendichte und Datenqualität es zulässt. Auch wenn man aus wenigen Datenpunkten optisch viel zaubern kann, ist es oft korrekter die Lücken zu bekennen. Durch das Gewichtungsverfahren, die Dichte des Grids und die Gewichtungsfaktoren kann man beeinflussen, wie groß der Einfluss eines Messwertes auf seine Umgebung ist: Je weiter der Radius um einen Gitterpunkt ist, innerhalb dessen Messwerte in die Berechnug des Knotenpunkts merklich eingehen, desto weniger spielen lokale Maxima eine Rolle und desto optisch glatter wird das Ergebnis. Ein Beispiel mit demselben Datensatz wie oben und unterschiedlichen Gewichtungsfaktoren des Befehls dgrid3d wird hier gegeben:

Gnuplot-Beispiel 10

Wie kann man die Grafik weiterverarbeiten ?

Man kann die Grafik direkt in die Zwischenablage kopieren und in ein Grafikprogramm (z.B. Corel Draw) einfügen, oder die Grafik z.B. in eine Postscript-Datei lenken. Postscript ist eine Vektorgrafik-Beschreibungssprache, die von vielen (eben postscript-fähigen)-Druckern interpretiert werden kann, insofern ohne Druckertreiber direkt von Drucker verstanden wird, wird aber auch von vielen Grafikprogrammen interpretiert. Für den Einbau in Publikationen bietet sich das sogenannte encapsulated Postsript (eps) - Format an. Für das Erzeugen einer Postscript-Datei reicht es aus, an die Befehle die folgenden 3 Zeilen anzuhängen:

Erzeugen von Postscript-Datei Erzeugen von Encapsulated Postscript-Datei
set output "datei.ps"
set terminal postscript
replot
set output "datei.eps"
set terminal postscript eps
replot

datei steht hier für irgendeinen beliebigen Dateinamen. Neben Postscript sind auch andere Grafik-Formate möglich, z.B. PING (png). Näheres erfährt man mit dem Befehl set terminal.

Tipps zur Achsenbeschriftung

Gnuplot-Code Wirkung
set xtics rotate 1 rotate bewirkt eine Drehung der Achsenbeschriftung um 90°, die 1 bewirkt, daß jeder xtic beschriftet wird (2 entsprechend jeder zweite ...)

Zeitformat als Achsenbeschriftung

Wenn der Zeitverlauf irgendeiner Messung dargestellt werden soll, muss gnuplot die x-Werte als Datum/Stunde/Minute etc. erkennen. Außerdem muss die Beschriftung der Achse angepasst werden

set xlabel 'Zeit'
set ylabel 'Höhe über Pegel 0 in cm'
set grid
set xdata time
set timefmt "%H:%M"
set format x "%H:%M"
set xrange ["12:00":"17:00"]
plot 'Cuxhaven_pgl.dat' using 3:4 with lines

Erläuterung

set xdata time definiert die x-Werte als Zeitangaben. set timefmt erklärt gnuplot, wie es die Daten zu interpretieren hat (hier Stunden:Minuten, also 16:45). set format x definiert, welche der Zeitinformationen als Achsenbeschriftung auftauchen soll. Als codes dienen dafür:

Nützliche links rund um Gnuplot