Gnuplot Tutorial

Gnuplot is een op programma voor het plotten van functies en data en het verrichten van niet-lineaire fitting op data.

Gnuplot kan gebruikt worden als stand alone software voor het maken van grafieken. Het kan een waaier aan output-formaten produceren: png-graphics, kolommen met tekstdata, LaTeX-output, grafieken in fig-formaat... Gnuplot kan ook onder het X window systeem grafieken afbeelden. Voor ons is echter het belangrijkste de mogelijkheid om niet-lineaire fitting op data te verrichten. Deze feature is veel krachtiger dan de traditionele lineaire- en polynoomregressie die we in andere software terugvinden.

Andere features van Gnuplot zijn de mogelijkheid om rudimentaire programmeercommando's uit te voeren, de mogelijkheid om shell-commando's uit te voeren en de mogelijkheid om output door te geven aan andere applicaties d.m.v. het pipe-mechanisme bekend uit de Unix/Linux-wereld. Gnuplot is ook ideaal voor cgi-applicaties waarin grafieken moeten gegenereerd worden.



Basic Gnuplot Commands

Start een interactieve Gnuplot-sessie

   gnuplot


Opm.: Gnuplot verlaten doe je met het commando quit


Zet de mouse support af

gnuplot> unset mouse 

Grafiek y = x2

gnuplot> plot x**2

# Opmerking: Het symbool voor machtsverheffing in Gnuplot is twee 
# sterretjes, "**". Gnuplot gebruikt niet "x^2" voor "x kwadraat".


Grafiek y = x2 voor x = -5 tot 5

   plot [-5:5] x**2
   

Plot sin(x) en x tot de 2de voor x = -pi tot pi

   plot [-pi:pi] sin(x),x**2


Grafiek y = x3 voor x = -5 tot 5 en y = -10 tot 10

   plot [-5:5] [-10:10] x**3

 
Om verschillende functies te plotten op hetzelfde scherm gebruik je komma's.

Voorbeeld:

	plot x**2,(x-2)**2,x**2-2

Maak een functie-tabel met x en y-waarden

    set table
#Bovenstaand commando zal ervoor zorgen dat de output van het plot-commando 
#niet langer op het scherm geplot wordt, maar in een data-tabel terecht komt. 
    plot [-5:5] x**2


Maak een functie-tabel met x en y-waarden en sla
de waarden op in een bestand met als naam "test.dat".

    set table "test.dat"
    plot [-5:5] x**2

U kan de aangemaakte data file bekijken met de pager (tekstbrowser) less zonder Gnuplot te verlaten:

    !less test.dat


Plot de data-file met naam "test.dat" 
die een tabel bevat met x en y-waarden.

    unset table
    plot 'test.dat'

Plot de data-file met naam "test.dat" gebruikmakend van lijnsegmenten.

# Opmerking: data-files kunnen commentaarlijnen bevatten maar 
# mogen geen andere lijnen bevatten zonder data.

    plot 'test.dat' with lines


Plot de data-file met naam "test.dat" gebruikmakend van lijnen en punten.

    plot 'test.dat' with linespoints


Voer een "smooth-operatie" uit op de data in een file met naam "test.dat".

    plot "test.dat" smooth csplines


Label de x- en y-as. Define a function and plot it.

    set xlabel 'x'         # set the x-axis label
    set ylabel 'y'         # set the y-axis label
    f(x) = x**2+2*x        # define a function, f(x)
    plot f(x)              


Gebruik van Gnuplot voor lineaire regressie.

# Maak de volgende sample data aan:

    d(x) = x + rand(0)        # voeg random waarden toe aan y = x

    set table 'test.dat'      # stel als output een data-tabel in

                              # met als bestandsnaam "test.dat"

    plot [-3 to 3] d(x)       # maak de data file aan.

    !less test.dat           # check de data file

# Fit een lineaire functie op de data.
# Dit zijn de instructies voor lineaire fitting.

    f(x) = a*x + b                   # definieer een lineaire functie

    fit f(x) 'test.dat' via a,b      # bereken de regressiecoëfficiënten a,b
  
# Merk op dat Gnuplot na fitting een "Asymptotic Standard Error" oplevert die een kwantitatieve indicator
# is voor de kwaliteit van de fitting. Er bestaat echter geen algemeen eenvoudig verband tussen deze 
# Asymptotic Standard Error en de meer bekende correlatiecoëfficiënt die we hanteren bij
# klassieke regressie-analyse. Daarom kan men tegenwoordig in Gnuplot ook de correlatiecoëfficiënt opvragen
# voor lineaire regressie met een extra commando:

    stats 'test.dat'

    unset table

# Plotten van de gefitte kromme en de bijhorende data
    plot f(x), 'test.dat'            # plot de rechte ende data 


# We gaan straks de correlatiecoëfficiënt ook op onze grafiek printen:

    set label sprintf("r = %1.4f", STATS_correlation)  at -2.75,3
    replot
# We willen ook de richtingscoëfficiënt op de grafiek:     

    set label sprintf("slope = %1.4f", STATS_slope)  at -2.75,2.75
    replot
# En tenslotte het intercept:

    set label sprintf("intercept = %1.4f", STATS_intercept)  at -2.75,2.5
    replot
# We kunnen meer algemeen de parameters bepaald uit de fitting zelf, ook rechtstreeks gebruiken (dus zonder
# informatie afkomstig van het stats-commando te gebruiken) als volgt:

    set label sprintf("functievoorschrift: %1.4f x + %1.4f [V]",a,b) at -2.75,2.25
    replot

Gebruik van Gnuplot voor niet-lineaire fitting.
# Vanaf nu maken we altijd een batch-file aan met de nodige commando's
# en voeren die dan naderhand uit. Maakt een batch-file aan met als naam 
# nietlin.gp (we gebruiken de extensie .gp voor Gnuplot batch files)
# Zet deze commando's in de batch-file:

    d(x) = x**2 + rand(0)      # voeg  random waarden toe aan x^2

    set table  "test.dat"      # stel als output een data-tabel in

                               # met als filename "test.dat"

    plot [-3 to 3] d(x)        # maak de data-file aan.


# Fit een 2de graads polynoom op de data.

    f(x) = a*x**2 + b*x + c          # definieer een kwadratische functie

    fit f(x) 'test.dat' via a,b,c    # bereken de coëfficiënten a,b,c

    unset table

    plot f(x), 'test.dat'            # plot de polynoom en de data


# Toon de coëfficiënten a,b,c

    show v      # of show var, show variables, etc.

# Save de batch-file nietlin.gp en voer hem uit met het commando:
    
    gnuplot < nietlin.gp -persist   # de vlag -persist is noodzakelijk om de  
                                    # scherminhoud te laten staan
Hoe een Gnuplot-grafiek in een LaTeX-document opnemen

# Stel de terminal in voor pslatex output

    set terminal pslatex
    set output "graf.tex"
    plot x**2
    set output
    q
# Bemerk hierboven laatste 'set output',
# nodig om de file netjes af te sluiten!  
# Maak de volgende LaTeX-file aan met naam latexdocmetgraf.tex 
# gebruikmakend van de teksteditor nano:

%==========================================================
% De grafiek zelf bevindt zich in de file 'graf.tex'.
%==========================================================
 
\documentclass{artikel3}
\usepackage[a4paper]{geometry}
\usepackage{varioref}
\usepackage[dutch]{babel}
\usepackage{graphicx}
\usepackage{epic,eepic,latexsym,rotating}
\begin{document}
De grafiek in figuur~\vref{fig:xkwadraat} werd gemaakt met Gnuplot.
\begin{figure}
%Het volgende commando laadt onze figuur 'graf.tex'
\include{graf}
\caption{$y=x^2$ gemaakt met Gnuplot \label{fig:xkwadraat}}
\end{figure}
\end{document}

# Run LaTeX met als input latexdocmetgraf.tex

	latex latexdocmetgraf.tex

# Run LaTeX nogmaals om cross-references (verwijzingen naar labels) in orde te brengen

    latex latexdocmetgraf.tex

# Zet de resulterende file latexdocmetgraf.dvi om naar een postscript-file:

	dvips latexdocmetgraf -o

# Bekijk de postscript-file latexdocmetgraf.ps met Ghostview:
 
        gv latexdocmetgraf.ps

# Hoewel het nuttig is de vorige "command chain" bestaande uit 4 commando's 
# te kennen --o.a. voor als er iets mis zou lopen bij de uitvoering van 1 van 
# de commando's --, kan het handig zijn dit proces te automatiseren. Met het 
# scriptje lx dat op de PCs in B225 en B226 onder Linux geïnstalleerd is, wordt
# de volledige command chain als volgt afgehandeld:
       
        lx latexdocmetgraf

# Om een paginavullende grafiek in LaTeX te bekomen ga je als volgt te werk:
# Stel de terminal in voor pslatex output
        
    set terminal pslatex size 25cm,17cm
    set output 'graf2.tex'
    plot x**2
    set output
    q
# Maak de volgende LaTeX-file aan met naam latexdocmetgraf2.tex
# gebruikmakend van de teksteditor nano:
        
%==========================================================
% De grafiek zelf bevindt zich in de file 'graf2.tex'.
%==========================================================
        
\documentclass{artikel3}
\usepackage[a4paper]{geometry}
\usepackage{varioref}
\usepackage[dutch]{babel}
\usepackage{graphicx}
\usepackage{epic,eepic,latexsym,rotating}
%Het hieronderstaande stukje code defineert een omgeving narrow die nodig
%is om paginavullende grafieken in het \LaTeX-document te kunnen
%opnemen
\newenvironment{narrow}[2]{%
\begin{list}{}{%
\setlength{\topsep}{0pt}%
\setlength{\leftmargin}{#1}%
\setlength{\rightmargin}{#2}%
\setlength{\listparindent}{\parindent}%
\setlength{\itemindent}{\parindent}%
\setlength{\parsep}{\parskip}}%
\item[]}{\end{list}}
\begin{document}
De grafiek in figuur~\vref{fig:xkwadraat} werd gemaakt met Gnuplot.
\begin{sidewaysfigure}[hbt]
\begin{narrow}{-1.2cm}{0in}
\include{graf2}
\caption{$y=x^2$ Gemaakt met Gnuplot \label{fig:xkwadraat}}
\end{narrow}
\end{sidewaysfigure}
\end{document}

# Run LaTeX met als input latexdocmetgraf2.tex

        latex latexdocmetgraf2.tex
        
# Run LaTeX nogmaals om cross-references in orde te brengen
        
    latex latexdocmetgraf2.tex
        
# Zet de resulterende file latexdocmetgraf2.dvi om naar een postscript-file:

    dvips latexdocmetgraf2 -o

# Bekijk de postscript-file latexdocmetgraf2.ps met Ghostview (gv) of Okular:

    gv latexdocmetgraf2.ps


Gebruik van Gnuplot voor grafische postprocessing van Spice-output
# Maak de volgende input-file voor Spice 2G6 met naam rc.cir:
  
   een genormaliseerd rc-ldf-filter
   vin 1 0 ac 1
   r1 1 2 1
   c1 2 0 1
   .ac dec 20 1m 100
   .print ac vdb(2) vp(2)
   .end

# Simuleer de schakeling met Spice 2G6 en maak een output-file rc.out aan:

   spice <rc.cir >rc.out

# Editeer de output-file rc.out zodat alleen de kolommen met de numerieke 
# waarden overblijven en noem deze file rc.dat

# Start Gnuplot op en geef volgende commando's:
   set logscale x
   plot [1e-3:100] 'rc.dat' smooth csplines, 'rc.dat'
# Vergelijk het resultaat met:
   plot [1e-3:100] 'rc.dat' smooth bezier, 'rc.dat'  
# Best van al is natuurlijk te fitten op het gekende functievoorschrift:
   f(x)=20*log10(a/(1+(x/b)**2)**0.5)
   fit f(x) 'rc.dat' via a,b
   plot f(x), 'rc.dat'
# Nu ook nog de fasekarakteristiek fitten en plotten:
   set angles degrees
   g(x)=-atan(x/c)
   fit g(x)  'rc.dat' using 1:3 via c
   plot g(x), 'rc.dat' using 1:3 
# Maak zelf een bladzijdevullende grafiek van deze plots voor LaTeX.

# Zet de Gnuplot-commando's voor de amplitudekarakteristiek samen in een batch-file rcamp.gp

# Zet de Gnuplot-commando's voor de fasekarakteristiek samen in een batch-file rcfas.gp

# De batch-file kunt u in Gnuplot laden met het commando: load 'rcamp.gp' respectievelijk load 'rcfas.gp'

# Of nog beter: gnuplot <rcamp.gp -persist respectievelijk gnuplot <rcfas.gp -persist

# Of nog anders: u kunt het script zelf uitvoerbaar maken door toevoegen op de 1ste regel

# van een shebang: #!/usr/bin/gnuplot, mits het script executable gemaakt is (chmod +x)

# kunt u het dan opstarten met: ./rcamp.gp

Boek over Gnuplot
Gnuplot in Action (Understanding data with graphs), Philipp K. Janert
Web Resources

Main Site voor Gnuplot
http://www.gnuplot.info/
Hier staan verschillende links voor tutorials en enkele
GUIs voor Gnuplot.

Gnuplot Tutorial by Henri Gavin
http://www.duke.edu/~hpgavin/gnuplot.html

Nog een aantal Gnuplot-links
http://users.skynet.be/hugocoolens/linux/gnuplotstuff.html

Voor vragen en problemen: vergeet de newsgroup comp.graphics.apps.gnuplot 
niet te raadplegen. Kijk eerst of uw vraag nog niet gesteld en/of 
beantwoord werd d.m.v. groups.google.com en post pas dan een boodschap in 
de nieuwsgroep.