Gnuplot

Transcription

Gnuplot
Gnuplot
— Eine kurze Einführung —
Gnuplot ist ein sehr vielseitiges Programm zum Plotten von Datensätzen oder mathematischen Funktionen in zwei oder drei Dimensionen. Weiterhin können mathematische Funktionen geplottet und in
bestehende Datensätze eingepaßt (gefittet) werden. Gnuplot ist kostenlos und kann für fast alle Betriebssysteme auf www.gnuplot.info (Download → SourceForge → gpXXXwin32.zip) heruntergeladen werden.
Allerdings ist gnuplot1 kommandozeilenbasiert, wenngleich man sich im graphischen Interface unter
Windows einzelne Textbausteine „zusammenklicken“ kann. Diese sehr kurze Einführung soll die ersten
Schritte mit gnuplot erleichtern und das Grundwissen bis hin zum Fitten von Funktionen an Hand von
Beispielen vermitteln. Sie gibt nur einen sehr kleinen Einblick in die Möglichkeiten von gnuplot und
stellt kein vollständiges Handbuch dar. Hierzu sei auf die zahlreichchen Webseiten über gnuplot hingewiesen. Auf www.gnuplot.info selbst gibt es eine Fülle von Beispielbildern und dem zugehörigen
Code.
Die mitinstallierte Hilfe von gnuplot ist sehr umfangreich und läßt keine Fragen offen, jedoch ist es
meist nicht leicht, den Befehl für eine gesuchte Einstellung zu finden.
1 Pfade
Gnuplot unterstützt einige Befehle aus der Linux-Welt. Die wichtigsten sind:
pwd
zeigt das aktuelle Arbeistverzeichnis an
cd ’c:/Daten’
wechselt das angegebene Verzeichnis
Achtung: Wie unter Linux und in Programmiersprachen wird der Schrägstrich „/“ als Trenner im Pfad
benutzt. Der Backslash „\“ funktioniert meistens auch, kann jedoch zu Fehlern führen. Vorsicht auch
bei Leerzeichen im Pfad!
2 Daten
Die zu plottenden Datenreihen müssen als Tabelle in einfachen Textdateien wie folgt vorliegen:
1
2.5
#3
4
3.0
*
4.1
3.6
1.62E-19
2E20
5000
0.38
Die einzelnen Datenreihen müssen spaltenweise vorliegen, als Trennzeichen werden Leerzeichen oder
Tabulatoren verwendet, die ggf zusammengefaßt werden. Bei mehrspaltigen Tabellen müssen fehlende
Zahlenwerte durch nicht als Zahl interpretierbare Zeichen markert werden, wie im Beispiel der zweite
Wert in der zweiten Spalte.
Ganze Zeilen können durch # komplett auskommentiert werden, sie werden von gnuplot vollständig
ignoriert.
1 nicht
Gnuplot!
1
Standardmäßig wird ein Punkt als Dezimaltrennzeichen erwartet. Mittels
set decimal sign locale
kann dies auf die Spracheinstellungen des Betriebssystems umgestellt werden, sodaß bei der Spracheinstellung „Deutsch“ das Komma benutzt wird. Dies betrifft sowohl das Eingabeformat (d.h. die Zahlen
in der Datei) als auch das Ausgabeformat (d.h. Achsenbeschriftungen etc.). Soll ausschließlich das Ausgabeformat geändert werden, genügt
set decimal sign ","
3 Plotten
3.1 Plotten von Datensätzen (mit Fehlerbalken)
plot ’datei.csv’ using 1:2
plottet den Inhalt der Datei datei.csv. Mittels using 1:2 werden die Spalten für die x- und y-Werte
der Koordinaten ausgewählt. An jeder Koordinate wird eine Markierung gesetzt.
plot ’datei.csv’ using 1:2 with dots
zeichnet an jeder Koordinate einen kleinen Punkt anstatt einer Markierung.
plot ’datei.csv’ using 1:2 with lines
Zeichnet eine Linie durch alle Koordinaten.
plot ’datei.csv’ using 1:2 with linespoints
zeichnet sowohl eine Linie als auch Markierungen.
plot ’datei.csv’ using 1:2 with histeps
eine Linie mit stufenförmigem Verlauf - ideal z.B. für einfache Histogramme2
plot ’datei.csv’ using 1:2:3 with yerrorbars
erwartet noch eine 3. Spalte und interpretiert diese als y-Fehler. Es werden allerdings nur Fehlerbalken
gezeichnet, keine Markierungen oder Linien!
plot ’datei.csv’ using 1:2:($1*0.05) with xerrorbars
Zeichnet Fehlerbalken in x-Richtung. Statt einer Spalte mit Fehlern zu lesen, wird hier gerechnet: Die
Klammern weisen auf eine Berechnung hin, innerhalb derer Spalten mittels vorangesetztem $ , hier
also $1 verwendet werden können. Dieser Plot nimmt also 5% der Werte der 1. Spalte als Fehler an.
Solche Rechnungen können nur innerhalb der Spalten einer Datei durchgeführt werden! Weiterhin können auch z.B. Differenzen zwischen zwei Spalten geplottet berechnet werden (...:($3-$4):.̇.) , oder
konstante Werte eingesetzt werden (...:(1.41):.̇.)
plot ’datei.csv’ using 1:2:3:4 with xyerrorbars
plottet Fehlerbalken in x- und y-Richtung, Fehlerwerte werden aus 3. unf 4. Spalte genommen
replot
wiederholt den letzten Plotbefehl.
3.2 Funktionen
Gnuplot kann beliebige Funktionen plotten, wobei als unabhängige Variable in karthesischen Koordinaten stets x erwartet wird. Etwas ungewöhnlich ist, daß Potenzen wie xy als x**y geschrieben werden.
Funktionen und Konstanten können auch zunächst definiert werden:
funktion(x)=a+2*x+x**3
a=1
plot funktion(x)
2 gnuplot
verfügt über verschiedene Möglichkeiten, Histogramme zu plotten. Das Histogrammieren selbst ist jedoch nicht möglich, es müssen also fertige xy-Koordinaten vorliegen.
2
3.3 Plotten mehrerer Funktionen / Datensätze
Der plot-Befehl kann mehrere Funktionen und / oder Datensätze plotten, wenn sie durch Kommas
getrennt sind:
plot ’datei.csv’ using 1:2, sin(x)
Bei sehr vielen zu plottenden Objekten ist es sinnvoll, die Zeile in mehrere aufzusplitten. Ein solcher
Zeilenumbruch wird durch \ markiert:
plot ’datei.csv’ using 1:2, \
’’ using 5:6, \
sin(x)
In der zweiten Zeile wurde der Dateiname weggelassen (’’). Es wird automatisch der zuletzt benutzte
Dateiname verwendet!
3.4 Farben, Linien und Punkte
Beim Plotten mehrerer Objekte wechselt Gnuplot standardmäßig Farbe und Form der Markierungen
und Linien. Welche Farbe und welche Punktform verwendet wird, kann fest vorgegeben werden. Beispielsweise möchte man seine Daten mit stufenförmiger Linie und Fehlerbalken zeichnen, was von
gnuplot nicht unterstützt wird. Man muß beides einzeln plotten, wobei die Farbe gleich bleiben sollte:
plot ’datei.csv’ using 1:2 with histeps linetype 1, \
’’ using 1:2:3 with yerrorbars linetype 1, \
sin(x) linewidth 3 linetype 2
Eine Liste der Linientypen und anderer Styles kann mit test angezeigt werden
3.5 Beschriftungen
Die Beschriftung der Achsen geschieht über set xlabel ’Die x-Achse’ etc. Weiterhin kann eine
Bildüberschrift mit set title ’Bildüberschrift’ erzeugt werden. Für geplottete Objekte wird
automatisch ein generischer Text in die Legende (den so genannten „key“) eingefügt. Der Text läßt
sich mittels title ’Datenreihe’ auch manuell angeben, ein notitle verhindert den Eintrag in
die Legende völlig:
plot ’datei.csv’ using 1:2 title ’Datenreihe’ with lines linetype 1, \
’’ using 1:2:3 notitle with yerrorbars linetype 1, \
sin(x) title ’Sinusfunktion’ linewidth 3 linetype 2
3.6 Achsen
set xrange[5:10]
x-Achse auf den Bereich [5;10] einstellen. Durch Angabe von set xrange[5:] kann beispielsweise
auch nur die untere Grenze festgelegt werden.
set autoscale x
x-Achse wieder automatisch skalieren lassen.
set log y
unset log y
y-Achse logarithmisch / linear darstellen.
3
set angles degrees
set angles radians
Gradmaß / Bogenmaß für trigonometrische Funktionen verwenden
4 Grafikausgabe
4.1 Bildschirm
Das Grafik-Fenster von Gnuplot läßt sich mit Maus und Tastatur bedienen (Siehe Tabelle 1), wobei die
Koordinaten an der Mausposition stets am unteren Rand angezeigt werden. Allerdings gibt es für fast
alles auch Kommandos. Benutzt man diese, muß die Grafikausgabe mit replot aktualisiert werden,
damit die Änderungen sichtbar werden.
Tabelle 1: Bedienung des gnuplot-Ausgabefensters, sowie entsprechende Befehle
Aktion
Rechte
Maustaste
e
Funktion
Gummiband zum Hineinzoomen
a
Daten neu einlesen und aktuelles Fenster neu zeichnen
Auf den gesamten Datenbereich herauszoomen
g
Gitter anzeigen/entfernen
l
y-Achse logarithmisch/linear skalieren
L
Die der Maus am nächsten liegende Achse logarithmisch/linear skalieren
Hor. und Vert. Linie einzeichnen - am unteren Bildrand wird auch der Abstand zur Mausposition angezeigt
r
Kommando
set xrange [5:10]
set yrange [5:10]
replot
set autoscale x
set autoscale y
set grid
unset grid
set log y
unset log y
set log x;set log y
unset log y; ...
—
4.2 Dateiausgabe
Gnuplot unterstützt eine Vielzahl von Ausgabeformaten. Für die direkte Verwendung in Dokumenten
unter Windows bietet sich z.B. das emf-Format an, da es ein Vektorformat ist und auch bei starker
Vergrößerung nicht verpixelt wird. Nach Angabe des Ausgabeformats und des Dateinamens folgt der
Plot-Befehl, anschließend muß die Bilddatei geschlossen werden:
set terminal emf
set output ’datei.emf’
replot
unset output
set terminal windows
Ein weiteres gebräuchliches (Raster-)Format ist PNG, hier ist eine Größenangabe in Pixeln erforderlich:
set terminal png size 800,600
Eine Besonderheit ist das Format epslatex: Hierbei wird eine unbeschriftete eps-Datei sowie eine texDatei ausgegeben. Letztere läd das eps-Bild, und beschriftet es innerhalb von LaTeX . Vorteil: Die Be-
4
schriftung geschieht in exakt der gleichen Schrift wie der restliche Text, und auch Formelsatz ist möglich:
set terminal epslatex size 4cm,3cm
Das Einbinden ins Dokument geschieht wie bei einer Bilddatei, jedoch mit \input statt \includegraphics.
Dieses Format wurde auch für dieses Dokument verwendet.
Generell ist zu beachten, daß manuelle Änderungen im Grafikfenster (log. Achsen etc.) nicht in die Bilddatei übernommen werden. Statt dessen muß zuvor das zugehörige Text-Kommando benutzt werden.
Weiterhin stimmen Linienstile und -Farben nicht immer überein, sodaß das die Grafik in einer Datei
von der Bildschirmgrafik abweicht.
5 Funktionen fitten
Oft erwartet man, daß ein Datensatz durch eine mathematische Formel beschrieben werden kann. Unter
dem Fitten einer Funktion in einen Datensatz versteht man das ermitteln der Parameter ~a = {a0 ; a1 ; ...}
einer Funktion f (x, ~a) derart, daß die Formel den Datensatz möglicht genau beschreibt. Die χ2 -Methode
zum Fitten von Funktionen soll hier kurz erläutert werden:
Gegeben sei ein Datensatz aus n Werten (xi ; yi ; σi ) , wobei σi die Fehler in y-Richtung darstellen. Nun
betrachtet man die Funktion
2
n X
yi − f (xi , ~a)
2
(1)
χ =
σi
i=1
Summiert wird zunächst über die quadratischen Abstände der Datenpunkte in y-Richtung, sodaß große
Abstände zu stärkeren Beiträgen zu χ2 führen, während kleine Abstände einen sehr viel geringeren Einfluss haben. Ein großer Fehler σi eines Datenpunktes yi führt zu einer geringeren Gewichtung der Abweichung dieses Punktes von der Funktion, während Abweichung von sehr präzise gegebenen Punkten stärker ins Gewicht fallen.
Das χ2 ist somit ein Maß für die Abweichung der Funktion vom Datensatz, und seine Minimierung
durch das ermitteln der korrekten Parameter ~a ist das Ziel des Fittens.
Wie gut die so ermittelte Funktion die Daten wiederspiegelt, läßt sich ebenfalls quantitativ über das χ2
χ2
bzw das „reduzierte χ2 “, welches über nDaten −n
gegeben ist, ermitteln.
Parameter
5.1 Grundlagen und Beispiel
Gnuplot ist in der Lage, mittels des Levenberg-Marquardt-Algorithmus die oben genannte Fitmethode
anzuwenden, und eine gegebene Funktion in einen Datensatz zu fitten. Hierzu muß die Funktion mit
den anzupassenden Parametern zunächst definiert werden. Dies wird an folgendem Beispiel demonstriert, wobei eine Gauss-Funktion in den mittleren Bereich gefittet werden soll:
In folgenden Datensatz soll eine Gaußfunktion in den mittigen Peak hineingefittet werden:
450
400
350
300
250
200
150
100
50
0
g(x) = √
(x − xc )2
exp −
2σ 2
2πσ 2
A
mit
A: Fläche unter Funktion
σ: Standardabweichung
xc : Peakposition
0
250
500
750
1000
5
Die Funktion wird in gnuplot als g(x)=A/sqrt(2*pi*s**2)*exp(-0.5*(x-xc)**2/s**2)
definiert, weiterhin müssen geschätzte Startwerte für die Parameter angegeben werden, die den erwarteten Werten einigermaßen nahe kommen. Wie nahe, ist unterschiedlich und hängt von den Daten, der
Art des Parameters sowie der Wahl der übrigen Parameter ab. Zur Demonstration sind die Parameter
im Folgenden absichtlich schlecht abgeschätzt:
xc=400
s=100
A=4000
Zum Fitten muß der Datenbereich, die zu fittende Funktion, die Datenreihe sowie die Liste aller anzupassender Parameter angegeben werden. So wird hier nur der (markierte) Bereich 200 bis
√ 900 in
x-Richtung verwendet und alle Parameter werden angepaßt. Die Fehler in y-Richtung sollen n, also
die Wurzel aus der zweiten Spalte sein.
fit [200:900] g(x) ’datei.csv’ using 1:2:(sqrt($2)) via A, s, xc
Die folgenden Plots zeigen die Funktion vor und nach dem Fit:
450
400
350
300
250
200
150
100
50
0
450
400
350
300
250
200
150
100
50
0
0
250
500
750
1000
0
250
500
750
1000
Während des Fittens gibt Gnuplot Text aus, der auch an die Datei fit.log im aktuellen Verzeichnis angehängt wird:
After 7 iterations the fit converged.
final sum of squares of residuals : 762.151
rel. change during last iteration : -2.44797e-07
degrees of freedom
(FIT_NDF)
rms of residuals
(FIT_STDFIT) = sqrt(WSSR/ndf)
variance of residuals (reduced chisquare) = WSSR/ndf
: 694
: 1.04795
: 1.0982
Final set of parameters
=======================
Asymptotic Standard Error
==========================
A
s
xc
+/- 330.7
+/- 0.2862
+/- 0.3858
= 99234.4
= 114.162
= 522.566
correlation matrix of the fit parameters:
A
A
s
xc
1.000
-0.021
-0.006
s
xc
1.000
0.036
1.000
6
(0.3332%)
(0.2507%)
(0.07383%)
Die für die Erzeugung der ursprünglichen Datenreihe verwendeten Parameter waren A=100.000, s=115
und xc=523 für den mittleren Peak. Der Fit ermittelt diese Daten also recht gut, wenngleich die verwendeten Parameter nicht im Bereich der Fehler liegen.
5.2 Fitten mehrerer Peaks
Manchmal sollen mehrere Funktionen der gleichen Art in einem Durchgang gefittet werden, z.B. wenn
sie sich deutlich überlagern. In diesem Fall muß die Funktionsdefinition etwas anders vorgenommen
werden, damit jede der Funktionen beim Fitten eigene Parameter besitzt:
g(x, A, s, xc)=A/sqrt(2*pi*s**2)*exp(-0.5*(x-xc)**2/s**2)
multiG(x)=g(x, A1, s1, xc1)+g(x, A2, s2, xc2)+g(x, A3, s3, xc3)
Es ist nicht nötig, multiG(x, A1, A2, A3, ...) zu definieren, da sämtliche Variablen in gnuplot
global sind, sodaß multiG(x) ausreicht.
A1=1000
xc1=350
s1=10
A2=10000
xc2=500
s2=100
A3=1000
xc3=640
s3=10
fit multiG(x) ’datei.csv’ using 1:2:3 \
via A1, A2, A3, w1, w2, w3, xc1, xc2, xc3
Auch dieser Fit klappt gut, wie ein Plot zeigt (Links vor dem Fit, rechts nach Fit):
4000
3500
3000
2500
2000
1500
1000
500
0
4000
3500
3000
2500
2000
1500
1000
500
0
0
250
500
750
0
1000
250
500
750
1000
Unter Berücksichtungung der Tipps (Siehe 5.3 ) ergeben sich folgende Fitparameter. (Vorgegeben: A1=50.000,
A2=1.000.000, A3=40.000, w1=20, w2=115, w3=12, xc1=360, xc2=523, xc3=640)
After 2 iterations the fit converged.
final sum of squares of residuals : 928.561
rel. change during last iteration : -4.85612e-06
degrees of freedom
(FIT_NDF)
rms of residuals
(FIT_STDFIT) = sqrt(WSSR/ndf)
variance of residuals (reduced chisquare) = WSSR/ndf
Final set of parameters
=======================
: 931
: 0.998689
: 0.99738
Asymptotic Standard Error
==========================
7
A1
A2
A3
w1
w2
w3
xc1
xc2
xc3
=
=
=
=
=
=
=
=
=
50651.3
999038
40332.6
19.9006
114.771
12.109
359.435
522.635
639.479
+/+/+/+/+/+/+/+/+/-
548.1
1182
474.7
0.2051
0.08687
0.1481
0.201
0.1505
0.1463
(1.082%)
(0.1183%)
(1.177%)
(1.031%)
(0.07569%)
(1.223%)
(0.05592%)
(0.0288%)
(0.02287%)
correlation matrix of the fit parameters:
A1
A2
A3
w1
w2
w3
xc1
xc2
xc3
A1
1.000
-0.359
-0.065
0.597
-0.293
-0.042
0.225
0.504
0.001
A2
A3
w1
w2
w3
xc1
1.000
-0.300 1.000
-0.259 -0.045 1.000
0.129 0.019 -0.210 1.000
-0.203 0.554 -0.029 0.012 1.000
-0.107 0.007 0.223 0.044 0.005 1.000
-0.098 -0.338 0.357 -0.185 -0.225 0.077
0.041 -0.104 0.000 -0.057 -0.125 -0.008
xc2
1.000
0.007
xc3
1.000
5.3 Tipps und Tricks
Falls der Fit nicht direkt gelingt und z.B. wegen einer „singulären Matrix“ oder einer „Divergenz“
mißlingt:
• Die Voreinstellung der Fitparameter etwas genauer wählen. Zur Überprüfung Daten und Funktion wie oben noch vor dem Fitten plotten, um falsche Formeln oder schlechte Startparameter zu
erkennen.
• Zunächst weniger Parameter fitten und Parameter wie z.B. Peakpositionen fest halten. Damit erzeugt gnuplot Parameterwerte, die den wahren Werten sehr nahe kommen, und die in einem
zweiten Durchlauf als Startparameter benutzt werden:
fit [200:900] g(x) ’datei.csv’ using 1:2 via A,s
fit [200:900] g(x) ’datei.csv’ using 1:2 via A,s, xc
Auch hier kann man zwischen den Fit-Durchgängen einen Plot zur Kontrolle durchführen.
• Zunächst ohne Fehler fitten, in einem weiteren Durchgang mit Fehlern
• Das Fitten scheint manchmal problematisch zu sein, wenn sich in der Nähe einer Polstelle der
Funktion Daten befinden. Dann kann man die Zeilen dieser Daten z.B. durch ein # in der Datendatei auskommentieren und zunächst einen groben Fit für die übrigen Werte machen.
6 Batchdateien
Für reproduzierbare Ergebnisse, einfachere Änderungen und eine bessere Übersicht bietet es sich an, alle Befehle zeilenweise in eine Textdatei zu schreiben. Diese kann in Gnuplot mittels load ’datei.plt’
geladen und ausgeführt werden. Ebenso ist es möglich, gnuplot mit dieser Datei als Argument aus der
8
Kommandozeile zu starten, oder *.plt-Dateien mit gnuplot so zu verknüpfen, daß sie bei Doppelklick
automatisch mit gnuplot ausgeführt werden. Problematisch ist, dass gnuplot in den letzten beiden Fällen keine Textausgabe erzeugt und bei Fehlern sofort abbricht. Eine Fehlersuche ist daher nur möglich,
wenn die Datei mittels load ’datei.plt’ geladen wurde. Möchte man innerhalb einer Batchdatei
mehrere Plots hintereinander plotten und betrachten, kann man durch den Befehl pause -1 erreichen,
daß Gnuplot die Abarbeitung der Datei kurz anhält und man die Ausgabe betrachten kann. Zum Auskommentieren einzelner Zeilen kann auch in Batchdateien das Doppelkreuz # verwendet werden.
Eine Datei zum Fitten des letzten Beispiels könnte wie folgt aussehen:
#### Definition Gauss-Funktion:
gauss(x, A, s, xc)=A/sqrt(2*pi*s**2)*exp(-0.5*(x-xc)**2/s**2)
#### Definition Multipeak-Funktion:
multiGauss(x)=gauss(x, A1, w1, xc1)+gauss(x, A2, w2, xc2)+ \
gauss(x, A3, w3, xc3)
#### Startparameter
A1=20000
xc1=350
w1=10
A2=100000
xc2=500
w2=50
A3=3000
xc3=640
w3=10
#### Fitten ohne Fehler zum Finden guter Parameter
fit multiGauss(x) ’Daten.csv’ using 1:2 via A1, A2, A3, \
w1, w2, w3, xc1, xc2, xc3
#### Fitten mit Fehler
fit multiGauss(x) ’Daten.csv’ using 1:2:(sqrt($2))
A1, A2, A3, w1, w2, w3, xc1, xc2, xc3
via \
#### Ausgabeformat PostScript
set terminal postscript
set output ’Gefittet.ps’
### Daten und Fit plotten
plot ’Daten.csv’ using 1:2:(sqrt($2)) notitle with yerrorbars lt 9,
multiGauss(x) notitle linetype 7 linewidth 3
unset output
\
#### Konvetierung in PDF
system(’epstopdf Gefittet.ps’)
Stand: 16. August 2010 – S.W.
9