Grundkurs GnuplotSommersemester 2002, Freie Universität Berlin |
![]() |
Inhalt:
|
Beispiel für die Darstellung einer 3-D-Funktion mit Gnuplot |
Gnuplot ist ein kommandozeilen-orientiertes, interaktives wissenschaftliches Plotprogramm. Es ist klein, mächtig 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. (An dieser Stelle ein grosses Danke für ein grosses Programm!).
Gnuplot ist umsonst und wird als Programmcode verteilt (siehe links zu Gnuplot). Das hat unmittelbare Vorteile, natürlich wegen der Kosten, die man für andere software aufbringen müsste, aber auch deshalb, weil man die Programme für jede Sorte von Rechnerarchitektur passend kompilieren kann. - allerdings auch muss, denn es wird keine fertige Software geliefert. - allerdings gibt es mit wgnuplot bereits eine fertig für Windows aufbereitete Version mit aufgesetzter Benutzeroberfläche.
Mit Gnuplot lassen sich Funktionen und Daten (Messwerte) in einem zweidimensionalen karthesischen Koordinatensystem oder in einem 3D-Raum darstellen. Flächen werden dabei als Netzgittermodell im 3dimensionalen Raum dargestellt oder als Kontur in die x-y-Ebene projeziert. Für 2D-Darstellungen stehen zahlreiche Arten der Darstellung (Styles) zur Verfügung, wie z.B. Linien, Punkte, Linien mit Punkten, Balken. Die Kurven und Achsen können mit Werten versehen werden, Markierung, Überschriften, Datums-und Zeitangaben etc. sind möglich. Die Hauptanwendung besteht vor allem darin, Wertepaare, die man aus Berechnungen, Messungen etc. erhalten hat darzustellen. Zusätzlich zu dieser Aufgabe können beliebige Funktionen (Polynome, trigonometrische Funktionen ...) geplottet werden und Interpolationen durchgeführt werden, d.h. Polynome als "best fit" durch gemessene Wertepaare gelegt werden. Zusätzlich zum üblichen karthesischen Koordinatensystem kennt Gnuplot auch polare Koordinatensysteme.
3D-Interpolation (gridding) zwischen unregelmäßig verteilten Datenpunkten (ein häufiges Problem) ist mit einem einfachen Gewichtungsverfahren möglich, andere Programme (z.B. Surfer) bieten in dieser Hinsicht weit mehr Möglichkeiten, aber für viele Ansprüche dürfte es bereits genügen.
Tortendiagramme sind nicht die Stärke von Gnuplot. Ebenso -soweit mir bekannt- ternäre Diagramme, was für Geologen natürlich schade ist ...
Gnuplot ist wie gesagt ein kommandozeilen-orientiertes, interaktives Programm, d.h. beim Aufruf erscheint ein Kommandofenster mit folgendem Prompt: (gnuplot>), das eine Eingabe verlangt, z.B. einen der Plotbefehle oder die Definion einer Funktion oder Angaben zur Formatierung einer Achse oder etwas ähnliches. Ist eine Eingabe erfolgt, wird sie ausgeführt, was man entweder sofort merkt (bei einem Plotbefehl) oder sich später auf folgende Plotbefehle auswirkt (bei Funktionsdefinitionen z.B.)
gnuplot> a=0.25 gnuplot> f(x)=sin(x)*a gnuplot> plot f(x)
Diese Befehlsabfolge (jeweils mit einem ENTER abgeschlossen) hätte z.B. das folgende Resultat:

Praktischerweise wird man diese Befehlsfolgen nicht immer wieder neue eingeben, sondern in eine Stapeldatei oder Script-Datei (eine einfache Textdatei, in Folgenden einfach plt-Datei genannt) schreiben, die dann aufgerufen werden kann (Befehl: load 'Datei.plt') und die Befehlsabfolge in Gang setzt. So kann man eine Datei immer weiter editieren, z.B. um die Achsenlänge zu verändern, dasselbe Grafikformat auf unterschiedliche Daten loszulassen etc.
Es gelten schon einige vordefinierte Standard-Einstellungen über den Stil der Abbildung z.B. daß die erste Grafik in rot gehalten wird etc. Angezeigt werden die gültigen Einstellungen mit dem Befehl show all. Diese Grundeinstellungen stehen in einer Datei namen .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.
Im Folgenden werden einzelne wichtige Befehle und Funktionen vorgestellt und illustriert, was sie bewirken. Zu jedem der Befehle existiert eine detaillierte Beschreibung, die mit dem Befehl help abfragen kann (z.B. help set). Die Beispiels-skriptdateien bauen teilweise aufeinander auf, es kommt immer etwas neues dazu. Sie können am Ende der Seite auch heruntergeladen werden, um sie z.B. als Vorlage für eigene Grafiken zu verwenden.
Die symbolisierten Papierkanten sollen Anfang und Ende der Datei darstellen (sieht zwar eher wie eine Tapete aus...).
|
# 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)
|
![]() |
Was passiert hier? Zunächst einmal werden die darzustellenden Achsenbereiche festgelegt: x von -5 bis 10, y von -150 bis 250, dann werden einige Konstanten definiert, die dann später in der Funktionsdefinition wieder aufgegriffen werden. Der Plot-Befehl plot f(x) stellt die Funktion dar.
|
# 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
|
![]() |
Was ist dazugekommen? mit set title wurde die Grafik beschriftet, 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:1Diese 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).
|
# 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
|
![]() |
Was ist dazugekommen? 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 übereinander 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.
|
# 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)
|
![]() |
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. Das Verfahren nennt sich "least squares fit" und besteht -kurz gesagt- darin, die Kurve zu finden, bei der die Summe der Abweichungen (zum Quadrat) zwischen Kurve und einzelnen Messpunkten minimal ist. 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. Ob der fit in diesem Fall sehr sinnvoll ist, sei hier mal irrelevant, es geht um das wie.
|
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'
|
![]() |
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 schlichte Textdatei mit 3 Spalten für x- y- und z-Werte handelt.
|
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)
|
![]() |
Anstelle von Meßwerten können auf 3dimensionale 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)
|
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'
|
![]() |
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:

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.
| 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 ...) |