Att rita funktionsgrafer med Gnuplot

Det är ofta som vi mattelärare behöver ta fram funktionsgrafer på formen y=f(x) . Webbverktyget Desmos är ett enkelt och interaktivt verktyg som ofta passar bra i klassrummet, men om man vill anpassa grafen med en text, en pil eller en figur så är inte Desmos det bästa verktyget. Det är heller inte det bästa verktyget om man behöver sin graf i ett dokument eller som en bild på webben.

Exempel på graf ur Desmos
Exempel på graf ur Desmos

Gnuplot är ett program där grafer kan anpassas i mycket hög grad. Programmet är fritt tillgängligt, men ärligt talat har det en hög tröskel för användandet. Grafen definieras av kod, och det finns många parametrar att variera.

Graf ur Gnuplot
Exempel på graf ur Gnuplot

Diagrammet ovan kan nog kan använda som mall i många sammanhang (naturligtvis med andra funktioner, dimensioner, texter och färger…). Mitt eget syfte med det var just att konstruera en mall som är användbar för mig, och att ha en referens för oss som inte talar flytande ”gnuplotska”.

Koden som producerar detta är:

# Koden kräver Gunplot 5.
# Välj filformat och namn som filen sparas på
set terminal postscript eps enhanced color font 'Helvetica,14'

# kommer att skapa en fil i eps-format
set output 'myplot.eps'

# Ladda t ex upp eps-filen till http://image.online-convert.com/convert-to-png för att konvertera till en png-fil
# Eller om programmet Imagemagick är installerat i miljön:
# convert -density 300  -flatten myplot.eps -background white myplot.png
# eller för transparens (där vit färg görs genomskinlig):
# convert -density 300  -flatten myplot.eps -background none -transparent white myplot.png
#
# Se: https://www.imagemagick.org/script/command-line-options.php

# För att å, ä och ö ska funka. Lite struligt, kommenterar mer nedan...
set encoding iso_8859_1

# Grafens upplösning
set samples 5000 
# Ju högre tal, desto mjukare graf. 100 är standard.

# Nyckel till graferna, om det behövs
#set nokey
set key horizontal below height 3 
set key box lt 1 dashtype "-" lc -1 lw 2

# Rubrik med storlek typsnitt
set title font ",22" norotate
set title "Exempel p{\345} ramverk f{\366}r funktionsgrafer i Gnuplot"

# Lite om koordinatsystemets utseende
set xtics font "Times-Roman, 18"
set ytics font "Times-Roman, 18"
# Typsnitt och storlek

# Definierar ls 12 och 13, används för eventuellt rutnät nedan
set style line 12 lc rgb 'gray' lt 1 lw 2
set style line 13 lc rgb 'gray' lt 0 lw 1

# Rutnät
set grid xtics ytics ls 12

# Om det önskas tätare rutnät
#set grid mxtics mytics ls 13 

# Korsande axlar, istället för ram
unset border
set xzeroaxis lt -1
set yzeroaxis lt -1

# Pilar på koordinataxlarna
set style arrow 1 head filled size screen 0.03,15,45 ls 1
set arrow 1 from graph 0, first 0 to graph 1, first 0 as 1 lc rgb "black"
set arrow 2 from first 0, graph 0 to first 0, graph 1 as 1 lc rgb "black"

# Förhållandet mellan diagrammets höjd och bredd
set size ratio 0.7 
# 0.7 betyder höjd = 0.7 * bredd

# Axelrubriker (kan även vridas)
set xlabel font "Times-Roman, 18" "{/Times-Italic x}" offset 35, 14
set ylabel font "Times-Roman,18" "{/Times-Italic y}" offset 32, 14 rotate by 0

# Intervall på axlarna, kan givetvis vara olika
set xrange[-5:5]
set yrange[-5:5]

# Skalstreck på axlarna
set xtics -4, 2, 4 axis
# Från -5 till 4 med 2 steg intervall på x-axelns huvudskala
set mxtics 3
# Tredjedelsintervall på x-axelns huvudskala

set ytics -4, 2, 4 axis
# Intervall 2 på y-axelns huvudskala
set mytics 3
# Tredjedelsintervall på y-axelns huvudskala

# Lite fritext i grafen...
set label font ",12" "F{\366}rklaring av skala,\nradbrytning m{\366}jlig" at 4,-1 center

set label font ",12" "F{\366}rklaring av skala" at -0.5,3 center rotate by 90

set label "{/Times-Italic f}({/Times-Italic x}) = (1/{/Times-Italic x}){/Symbol \327}sin({/Times-Italic e^x}) + 1" at 2,-5.6 left rotate by 0 font "Times-Roman,16" textcolor rgb "red"

set label "{/Times-Italic g}({/Times-Italic x}) = 8/3 - {/Times-Italic x}^2" at 2,-6.4 left rotate by 0 font "Times-Roman,16" textcolor rgb "black"

# Funktioner som ska ritas
f(x) = x<4.5 ? 1/x*sin(exp(x))+1: 1/0
g(x) = (2.0+2.0/3.0)-x**2
# OBS! Beräkningar ger heltal om det inte ingår decimaler...
# (Funktionen f(x) ritas fram till x = 4.5, därefter stopp av estetiska skäl.)

plot f(x) ls 1 linecolor rgb "red" lw 2, \
g(x) ls 2 dashtype "." linecolor rgb "black" lw 2
# ls är LineStyle och lw är LineWidth.

Ja, som synes är det rätt mycket kod för att producera en graf med text och kommentarer. Jag har dock tagit ut svängarna med olika typsnitt, en hel del text och olika stilar på graferna.

Accentuerade bokstäver kräver sina speciella s.k postscript-koder. Här är koderna för de svenska tecknen:

å: \345 ä: \344 ö: \366
Å: \305 Ä: \304 Ö: \326

Övriga postscriptkoder hittas här.

Jag återkommer med exempel på hur grafer kan produceras ur värdetabeller med Gnuplot. Det kan dock mycket enkelt göras med nästinpå valfritt kalkylprogram. Det jag säkert också kommer att få anledning att återkomma till är hur man färgfyller ett område under en graf eller mellan grafer.

Kommentera gärna!