Einstieg in Gnuplot

Im Verlaufe des Praktikum B des Physik Studiums in Köln muss ein jeder Student lernen, wie man Auswertungen in digitaler Form anfertigt. Natürlich gehört dazu auch auf Milimeterpapier und Bleistift zu verzichten und seine Graphen mit einem speziellen Programm zu erstellen. Eines der meist verwendeten Programm ist Gnuplot. Dieses kommandozeilengesteuerte Programm ist für nahezu jedes Betriebssystem verfügbar und wird bereits mit den meisten Linux-Distributionen ausgeliefert.

Dieses Mini-Tutorial soll nun die Basics von Gnuplot vermitteln, so dass jeder Student in der Lage sein dürfte ansehnliche Plots von seinen Daten zu erstellen. Natürlich können nicht alle Möglichkeiten zur Gestaltung hier vermittelt werden; das würde einfach den Rahmen sprengen.

Ein minimales Beispiel

plot1Links sieht man einen einfachen Plot der Funktionen -x², x² und x³ im Definitionsbereich [0:1] und im Wertebereich [-1:1]. Wir sehen weiterhin, das bereits die Ordinate und Abszisse beschriftet („gelabelt“) sind und das die Legende mittig rechts positioniert wurde. Um dieses Plot zu erstellen bedarf es folgender Eingaben bei Gnuplot: mit set xlabel bzw. set ylabel kann man die Beschriftung der Achsen „setzen“. Die Beschriftung muss in Anführungszeichen danach folgen. Mit xrange und yrange setzt man die Regionen der x- bzw. der y-Achse, welche gezeichnet werden sollen. Die Bereiche müssen über das Intervall [i:j] definiert werden. Dabei können i und j Zahlen sein. Will man eine Zahl variabel und somit Gnuplot entscheiden lassen welcher Wert sinnvoll ist, fügt man ein * ein. Die Legende wird key genannt und wir mit dem Begriff at gesetzt. Wichtig bei der Positionierung von Objekten bei gnuplot ist die Angabe eines Bezugssystems. In dem Fall unten wurde first gewählt, welches den x- und y-Achsen des Plots entspricht. Im Gesamten sieht dies nun folgendermaßen aus:

gnuplot> set xlabel "x"
gnuplot> set ylabel "f(x)"
gnuplot> set xrange [0:1]
gnuplot> set yrange [*:*]
gnuplot> set key at first 1,0.3
gnuplot> plot -x**2 title "-x^2", x**2 title "x^2", x**3 title "x^3"

 Mathematische Ausdrücke unterscheiden sich innerhalb von Gnuplot fast nicht von denen anderer Programm. So sind die Exponentialfunktion und der Logarithmus über exp(…) und log(…) verfügbar. Einzig, wie oben zu sehen, ist das exponentieren ungewöhnlich, welches mit zwei Sternchen geschieht: x**2 entspricht x².

Um diesen Plot nun in eine Datei zu speichern, welche man dann gegebenenfalls in ein Protokoll einfügen kann, muss man bei Gnuplot ein Ausgabe-Terminal und eine Ausgabedatei definieren bevor man es plottet. Das Standardterminal von Gnuplot ist „wxt“, welches nichts anderes tut, als ein Fenster zu öffnen in dem der Graph erscheint. Mit help terminal lässt sich innerhalb von Gnuplot eine Liste der Verfügbaren Terminals ausgeben. Die wichtigsten hierbei dürften sein: postscript, postscript eps, pdf und pngcairo. Wie die Namen schon zeigen dürfen, kann man mit diesen vier Terminals postscript, eps, pdf und png Dateien erstellen. Für Physikstudenten, welche häufig mit Hoch- und Tiefstellungen, sowie mit griechischen Buchstaben hantieren müssen sind die ersten drei am wichtigsten!

Um sich eine *.png Datei des Plots im Format 800×800 ausgeben zu lassen erweitert man den Code oben folgendermaßen:

gnuplot> set terminal pngcairo font "Times,30" size 800,800
gnuplot> set output "plot.png"
gnuplot> set xlabel "x"
gnuplot> set ylabel "f(x)"
gnuplot> set xrange[0:1]
gnuplot> set yrange[*:*]
gnuplot> set key at first 1,0.3 
gnuplot> plot -x**2 ti "-x^2", x**2 ti "x^2", x**3 ti "x^3"

Wir haben das Terminal pngcairo gewählt mittels set terminal. Die Größe der Ausgabedatei haben wir mit einen nachfolgenden size 800,800 definiert und um die Schrift nicht zu klein werden zu lassen mittels font „Times,30“ diese angepasst. Durch den Befehl set output setzt man nun die Ausgabedatei (welche zu diesem Zeitpunkt noch nicht existieren muss). Ohne diese Ausgabedatei, wird der Plot zwar erzeugt, aber eben nicht auf der Festplatte gespeichert. Im Letzten Befehl haben wir den Begriff title durch ti abgekürzt. Bei Gnuplot gibt es eine Vielzahl solcher Abkürzungen, die die Arbeit erleichtern können. Alle diese Abkürzungen lassen sich „ergooglen“.

Hinweis: Um den Aufwand beim Erstellen eines Plots mittels Gnuplot zu minimieren, sollten die Befehle für Gnuplot in eine Datei geschrieben werden. Diese Datei kann nun extern editiert und innerhalb von Gnuplot mit dem Befehl load „plot.gp“ geladen werden, wobei plot.gp ein beliebiger Name einer Datei seien kann. Wichtig: Alle gesetzten Parameter bleiben danach bis zum Schließen von Gnuplot bestehen! Unter Linux und OSX lässt sich auch so eine Datei einfach mit dem Befehl gnuplot plot.gp aus der Konsole ausführen. Unter Windows innerhalb der Powershell oder Command-Line mittels gnuplot.exe plot.gp oder man öffnet die Datei einfach mit Gnuplot.

Entscheidet man sich mittels

set terminal pdf enhanced font "Times,30"
set output "plot.pdf"

oder

set terminal postscript eps enhanced font "Time,30"
set output "plot.eps"

für die Terminals postscript eps und pdf, so ist es auch möglich Ausdrücke mittels „x^{2}“ und „H_{2}O“ in der Ausgabedatei hoch- bzw. tiefzustellen.  Weiterhin ist bei diesen Terminals die Verwendung von Sonderzeichen möglich. Ein α schreibt sich bspw. als „{/Symbol a}“. Dies ist jedoch nur bei den pdf und postscript terminals möglich. Jedoch, durch die Möglichkeit eps und pdf Dateien direkt in Latex-Dokumente einzubinden, sollten diese Terminals eben Standard für Physiker und Physikstudenten sein.

Plotten und Fitten von Messwerten

plot2Ein Programm für die Auswertung von Daten muss natürlich auch das Feature besitzen, Messdaten zu zeichnen und beliebige Funktionen an diese anzupassen, zu fitten. Hier soll nun beschrieben werden, wie dies mit Gnuplot gemacht werden kann.

Neben stehend ist ein Beispiel-Plot gezeigt, in dem Messwerte, welche einem annähernd linearen Trend folgen, mit ihren x- und y-Fehlern gezeichnet wurden. Zudem wurde eine lineare Funktion der Form f(x)=a*x+b an die Werte angepasst und mit hinein gezeichnet. Damit Gnuplot die Daten in einer Datei verstehen kann müssen diese zum einen in Spalten angeordnet und zum anderen mit einem Punkt anstelle eines Kommas als Dezimaltrenner geschrieben sein. Die Beispiel-Messdatendatei für diesen Plot sähe zum Beispiel so aus:

#Beispieldatei daten.dat
#xWerte xFehler yWerte yFehler
#
1 0.2 0.97 0.05
2 0.2 2.08 0.10
3 0.2 2.56 0.30
4 0.2 4.10 0.08
...

Alle Zeilen die mit einer Raute (#) beginnen, werden von Gnuplot ignoriert. In diesem Beispiel sind die x-Werte und ihre Fehler in den Spalten 1 und 2 geschrieben; die y-Werte und ihre Fehler in Spalte 3 und 4.

Um diese Daten zu plotten, benutzt man nun den folgenden, angepassten „plot“-Befehl

gnuplot> plot "./daten.dat" using 1:3:2:4 with xyerrorbars ti "Messdaten"

In den Anführungszeichen nach dem Befehl plot folgt der vollständige Pfad zur Datei. Der Parameter using zeigt Gnuplot welche Spalten aus der Datei verwendet werden sollen. Der Parameter with xyerrorbars bestimmt nun wie die Daten gezeichnet werden sollen. Hat man nur einen y-Fehler und keinen x-Fehler, dann würde man with yerrorbars benutzen. Für das Format xyerrorbars ist es wichtig, dass die Spalten im Format x:y:dx:dy nach using angegeben werden.

Wie fittet man nun eine Funktion an die Daten? In Gnuplot kann man im Prinzip jede beliebige Funktion mit einer beliebigen Anzahl von Parametern definieren. Man gibt einfach den Befehl:

gnuplot> f(x)=a*x+b

Diese Funktion kann nun mittels dem Befehl

gnuplot> fit f(x) "./daten.dat" using 1:3 via a,b

an die Daten in der Datei „daten.dat“ angepasst werden. Wieder muss nach using die x- und y-Spalte angegeben werden. Nach via müssen alle Parameter der Anpassungsfunktion kommagetrennt angegeben werden. Die Ergebnisse des Fits werden von Gnuplot dann in eine Datei fit.log geschrieben.

Hinweis: Je komplexer die Anpassungsfunktion ist, umso schwieriger kann es werden den Fit zur Konvergenz zu bringen. Deshalb empfiehlt es sich vor dem Aufruf des Befehls „fit“, Startwerte für die Fitparameter anzugeben, die nicht soweit von den „wahren“ Werten liegen sollten. Speziell beim Anpassen einer Gaußfunktion sollte auf relativ gute Startparameter geachtet werden. In diesem Fall, würden wir das so machen:

gnuplot> a=1
gnuplot> b=0

Wie wir nun die Werte mit Fehlerbalken und die Anpassungsfunktion zusammen plotten sowie alle Einstellung so setzen, dass wir obiges Bild erhalten, führen wir mit Gnuplot folgenden Befehlssatz aus:

set terminal pngcairo font "Times,30" size 800,800
set output "plot.png"

set xlabel "x"
set ylabel "f(x)"

set key bottom right

set yrange [0:20]
set xrange [0:20]

f(x)=a*x+b
fit f(x) "daten.dat" u 1:3 via a,b

plot "daten.dat" u 1:3:2:4 with xyerrorbars ti "Messdaten" pt 7 lc "black" lw 1, f(x) lc "black"

unset output

Zudem bisherig erklärten Optionen haben wir hier zudem die Linienfarbe (line-color, lc) auf „black“ gesetzt und uns für den Punkttyp (pointtype, pt) 7 entschieden.

Fortgeschrittene Sachen mit gnuplot

Gnuplot ist ein unheimlich mächtiges Werkzeug, wenn man weiß, wie man damit umzugehen hat. Jedoch gibt es auf jeden Fall Programme die weitaus intuitiver sind. Deshalb kommt man bei fortgeschrittenen Sachen wie dreidimensionale Plots, Matrizen, gefüllte Kurven, gezeichnete Objekte, Vektorpfeile etc., nicht umhin sich selber nach Lösungen umzuschauen. Mit dem Wissen was hier vermittelt wurde, dürfte es aber jeden möglich sein, die Sachen, die man im Anfängerpraktikum noch per Hand gemacht hat, nun mit Gnuplot zu machen.

Für alle anderen Sachen ist folgender Link eine gute Startadresse:

Kommentar verfassen