• No results found

Pass 4 – 2D-Grafik

I det här passet kommer vi att koncentrera oss på att skapa grafik, histogram, plottar och annat som kan användas för att åskådliggöra experimentella resultat. Vi skall försöka avstå från frestelsen att komma med pekpinnar om hur grafik skall utformas för att vara bra, utan i stället koncentrera oss på att gå igenom tekniken, så att vi kan åstadkomma grafik som ser ut som vi avser. Efter att ha gått

igenom det här passet skall du själv kunna producera en plot som denna och också kunna både skriva ut den och kopiera in den i ett word-dokument för att bifogas i en lab-rapport.

6.1 Kurvor i två dimensioner

Att skapa enklare två-dimensionella plottar i MATLAB är relativt enkelt. En skillnad mellan MATLAB

och en del andra grafikprogram är att vi inte kan instruera MATLAB att till exempel rita kurvan y=sin(x). Istället måste vi ge MATLAB en uppsättning punkter med en x-koordinat och en y-koordinat.

MATLAB ritar sedan upp en mjuk kurva som förbinder punkterna. Vill vi rita upp y = sin(x) måste vi därför först själva skapa en x-vektor och sen y-vektor 8där y=sin(x) och instruera MATLAB att rita en kurva mellan dessa bägge punkter. Låt oss börja med något enkelt som att rita grafen för y = 2x + 3.

>> x = [1 8];

>> y = 2*x + 3;

8 Eftersom det MATLAB använder i plottandet är punkter, vars x- och y-koordinatar kommer från vektorerna x och y så måste vektorerna ha samma antal element.

0 2 4 6

6.1.1 Att växla mellan fönster, och städa i fönster.

När vi trycker på return efter att ha givit plot kommandot öppnas ett nytt fönster, MATLABs grafikfönster där plotten visas. När vi jobbar med grafik kommer vi att vilja pendla mellan många fönster. Ofta kommer vi att utföra samma lunk mellan m-fil editorns fönster där vi just ändrat någon detalj i en m-fil till kommandofönstret för att köra filen till grafikfönstret för att se hur det blev. Det finns flera metoder för att snabbt växla mellan fönster, vilken som passar bäst just för stunden beror litet på exakt vad man håller på med och hur man föredrar att jobba.

• Det kanske enklaste sättet är att helt enkelt lägga fönstren bredvid varandra, eller i alla fall se till inget fönster ligger helt bakom de andra. Genom att klicka och dra på kanten av ett fönster kan du flytta det vart du vill på datorns skrivbord, och genom att klicka och dra i ett aktivt fönsters nedre högra hörn kan du ändra dess storlek. Om du lägger upp de fönster du jobbar i så att det alltid sticker fram någon bit av fönstret även när det är de andra fönstren som är aktiva så kan du enkelt byta fönster bara genom att klicka med musen i det fönster du vill skall bli det aktiva.

• Ett annat sätt att vandra mellan fönstren är att gå in i MATLABs meny "Windows" och välja det fönster man vill göra aktivt.

• I windows finns det en funktion för att bläddra mellan alla fönster som är öppna på datorns skrivbord. Håll "alt"-tangenten nedtryckt och tryck på TAB tangenten. Varje gång du trycker ned TAB bläddras ett nytt fönster fram som aktivt.

• Befinner du dig i MATLABs kommandofönster och vill till grafikfönstret kan du skriva "figure(1)"

i kommandofönstret, då blir fönstret med det namnet aktivt. Vill du tillbaks från grafikfönstret till kommandofönstret trycker du bara på return.

Vill du städa upp i grafikfönstret skriver du (i kommandofönstret) clf (CLear Figure window), vill du städa upp i kommandofönstret ger du kommandot clc (CLear Command window). Du kan stänga grafikfönstret genom att ge kommandot close.

6.1.2 plot-kommandot

Låt oss prova att plotta en litet mer komplicerad kurva, y = x2. Pröva

>> x = [1 4];

>> y = x.^2;

>> plot(x,y)

Resultatet blir inte direkt vad vi väntat oss, men egentligen är det inte så märkligt: plot kommandot ser ju bara de punkter vi vill rita en graf mellan och har ingen aning om det två punkterna (1,1) och (4,16) är två punkter på kurvan y=x2, eller om de ligger på kurvan y = 5x-4. Mer information måste alltså till, pröva att lägga till punkten (x,y) = (2,4). Inte heller särskilt imponerande. För att kurvan skall bli jämn och fin och följa det funktionssamband vi önskar måste vi ge MATLABs plot kommando vektorer där punkterna ligger ganska tätt. Lyckligtvis går det ganska enkelt om vi bara använder oss av MATLABs vektorfunktioner. Antag till exempel att vi vill plotta y=x2 mellan 0 och 4.5. Vi kan då antingen använda kolonoperatorn för att skaffa oss en x-vektor där elementen har värden från 0 till 4.5 med vilket avstånd vi vill, till exempel 0.1: x = (0:0.1:4.5) gör susen (när vektorerna får så här många element vill man gärna stänga av ekot genom att ge semikolon efter kommandot). Alternativt kan vi använda linspace för att skapa 50 punkter mellan 0 och 4.5: x = linspace(0,4.5,50);

ger oss också en användbar x-vektor. När x-vektorn är klar skapar vi en y-vektor med y = x.^2 och plottar resultatet.

Prova nu att plotta några andra funktioner som polynom och sin(x) för att se att resultatet blir som du förväntar dig.

6.1.3 Styra utseendet på grafiken

Det mesta av den tid man spenderar på att göra grafer tenderar att läggas på att få lay-outen att bli vad man har tänkt sig. Eftersom korrekt och tydlig lay-out är ett viktigt verktyg för att åstadkomma grafik av hög kvalitet kan det vara värt besväret att redan från början försöka lära sig de kommandon som krävs för att man skall kunna styra programmet dit man vill.

bakgrundsfärg

Kommandot whitebg(c) ger dig möjlighet att ändra färgschemat på din plot. Prova till exempel att ge kommandot whitebg('g') och se vad det får för resultat. Argumentet till kommandot kan vara antingen en förkortning som ovan, ett färgnamn i klartext till exempel whitebg('blue')9. Exemple på vilka färgkoder som finns kan du se du ger kommandot help plot. Kommandot whitebg ändrar inte enbart färgen för plottens bakgrun, även färgen på den omgivande ramen, axlar och kurvor ändras på ett sätt som skall ge god kontrast och läsbarhet för hela grafen.

Linjefärg, linjetyp och markörer

Kommandot plot kan ges med tre argument: plot(x,y,S). Argumentet S är en textsträng som anger hur linjen som ritas skall formatteras. Det finns tre typer av information att styra, dels färgen på linjen, dels hur linjen dras (heldragen, prickad mm), och slutligen markör, eller vilken symbol som skall ritas ut i de punkter som anges av vektorerna. Skrver du help plot kan du bland annat hitta följande lista på vilka möjligheterna är:

Linjefärg Markör Linjetyp

y yellow . point - solid

m magenta o circle : dotted

c cyan x x-mark -. dashdot

r red + plus -- dashed

g green * star

b blue s square

w white d diamond

k black v triangle (down)

^ triangle(up)

< triangle(left)

> triangle(right)

p pentagram

h hexagram

Man kan i plot kommandot använda en godtycklig kombination av dessa (men bara ett val för varje kategori!). Prova med litet olika kombinationer för att se hur det fungerar, en gul kurva med heldragen

9 För experter kan nämnas att argumentet till whitebg också kan vara en så kallad RGB kod, vilket ger möjlighet att välja exakt den nyans man vill.

linje mellan små cirklar ges t.ex av plot(x,y,'yo-'). Märk att om man ger formatkommandot för linjefärg och markör men inte någon kod för linjetyp som t.ex. plot(x,y,'bo') så ritas endast punkterna ut utan någon sammanbindande linje.

Rutnät

Ibland vill man lägga in ett rutnät över grafen för att underlätta avläsningen av koordinater. Detta görs med kommandot grid on. För att slå av ett rutnät använder du grid off. Ger man bara kommandot grid så växlar man mellan dessa tillstånd (engelskans toggle) man läget för rutnätet.

6.1.4 Koordinataxlar

Om vi inte ger något kommando för att speciellt formattera koordinataxlarna väljer MATLAB axlar så att hela grafen lagom ryms i grafikfönstret. Många gånger vill man själv bestämma hur koordinataxlarna läggs ut, antingen för att man vill zooma in ett intressant område, eller för att man vill lägga in litet luft, plotta till exempel y=x2 mellan -2 och 3, det ser inte snyggt ut just kring origo.

För att styra detta ger vi kommandot axis([xmin xmax ymin ymax]) där xmin är minimivärdet på x-axeln och så vidare. Kommandot axis skall ges efter plot-kommandot, testa med axis ( [-2 3 -.5 10] ) på vår andragradskurva! Det kan verka en smula omständigt att axis kommandot tar sitt arguement i formen av en vektor, vilket gör att vi måste skriva in två omgångar parantestecken när vi skriver in kommandot. Rätt använt kan dock just detta faktum spara mycket arbete särskilt när vi skriver m-filer som skall producera grafik. Den enklaste varianten är att vi istället för att ange siffervärden lagrar siffrorna i en vektor och ger den som argument till axis kommandot. Prova till exempel

>> stor = [-5 10 -5 25];

>> axis(stor);

>> figure(1)

>> liten = [-0.5 2.1 0 3.1];

>> axis(liten);

>> figure(1)

Tappar vi tråden kan vi se vilken inställning som för ögonblicket gäller genom att ge kommandot axis utan argument. MATLAB skriver då ut den aktuella vektorn. Vi kan även spara en inställning genom att ge kommandot vektor = axis, där vektor är ett godtyckligt namn på en vektor i vilken de aktuella värdena sparas. Ett användningsområde för detta trick är om vi skriver en allmän m-fil för att plotta data och alltså inte i förväg vet vilka x- och y-värden som blir aktuella. Om vi ändå vill plotta kurvan med litet luft ikring kan vi använda en variant av följande sekvens:

>> x = (-1.5: .05 : 1.5);

>> y = sin(x);

>> plot(x,y)

>> current=axis;

>> mellanrum=0.3

>> ny(1) = current(1) - mellanrum;

>> ny(2) = current(2) + mellanrum;

>> ny(3) = current(3) - mellanrum;

>> ny(4) = current(4) + mellanrum;

>> axis(ny);

>> figure(1)

Axis har en hel del special-argument, för en fullständig lista skriv help axis, några av de mer användbara är:

• axis equal som ger lika skalindelning på x- och y-axeln.

• axis image ger lika skalindelning på x- och y-axeln, men krymper bildytan så att alla datapunkter precis ryms.

• axis square gör bildytan kvadratisk

• axis tight krymper bildytan så att alla datapunkter precis ryms.

• axis normal återställer omskalningar till standardläge

• axis off ritar grafen utan axlar

För att skriva ut beteckningar på x- och y-axeln använder vi kommandona xlabel('text') respective ylabel('text'), där text är den sträng vi vill skriva ut som beteckning på axeln.

Prova att skriva in beteckingar på bägge axlarna! Man kan påverka utformningen av etiketterna på många vis genom MATLABs s.k. "property editor". Vi kommer att återkomma till det i pass 7, men om du redan nu är nyfiken så går det att läsa mer om detta i hjälp-avsnittet

?/Graphics/Formatting¬Graphics/Adding¬Axes¬Labels¬to¬a¬Graph

Ett vanligt fel som kan leda till i det närmaste obegripligt beteende hos matlab är om man någon gång glömmer bort syntaxen för axis-kommandot och istället skriver axis = ([xmin xmax ymin ymax]).

Matlab skapar då en vektor som heter axis. När vi sedan korrigerar vårt misstag och i en serie kommandon som skall leda fram till en graf skriver axis([xmin xmax ymin ymax]) så kommer inte matlab att utföra det kommando vi önskar eftersom det finns en vektor med namnet axis i workspace.

Matlab antar då att det som ges inom () efter axis är ett index i den vektorn, och eftersom ett index inte kan ges på formen [xmin xmax ymin ymax] så får vi ett felmeddelande om detta. Denna situation reder vi ut genom att radera vektorn axis med kommandot clear axis.

6.1.5 Text

Titel-text

Ofta kommer vi att vilja lägga till text i graferna för att till exempel visa vilka parameter-värden som använts. Det första vi gör är att lägga till en titel högst upp ibildytan, med kommandot title('text'), prova med title('Sinuskurvan')! Man kan även lägga till en titel ifrån MATLABs

desktop, men eftersom vi koncentrerar oss på kommandon som kan utföras från en m-fil så går vi inte in på det här, vill du veta mer så kan du läsa hjälptexten under

?/MATLAB/Using¬Matlab/Graphics/Formatting¬Graphs/Adding¬a¬Title¬to¬a¬Graph.

Även för title kommandot återkommer vi i pass 7 till hur man kan styra egenskaperna hos titeltexten mer i detalj.

Fri text

Vi kan ocskå lägga till text på godtyckligt ställe i grafen genom att använda kommandot text(x,y,'sträng') som skriver in texten sträng vid punkten (x,y). Prova att placera in en textsträng på rätt ställe i grafen, det kan ta ett tag innan man får koordinaterna rätt. Du ser att textsträngens nedre vänstra hörn placeras vid den koordinat som anges. Om man ger fler textkommandon i följd så försvinner inte de gamla textsträngarna. Även för fri text finns det verktyg som enkelt placerar in och formatterar text i MATLABs desktop, även dessa lämnar vi åt sitt öde, men de finns dokumenterade i

?/ MATLAB/Using¬Matlab/Graphics/Formatting¬Graphs/Adding¬Text¬Annotations¬to¬a¬Graph. Kurvbeskrivningar

Vi kommer snart att börja plotta mer än en kurva i varje graf. Det kan då vara bra att ha en beskrivning över vilken kurva som visar vilken storhet. En sådan läggs in med k o m m a n d o t legend('beskrivning 1, beskrivning 2, ….) där beskrivning 1 är den textsträng som beskriver den kurva som ritades med det första plot kommandot, beskrivning 2 den som ritades med det andra plot kommandot osv.

6.2 Plotta punkter med fel

Om du gjort en serie mätningar av en variabel y som funktion av x, och y-värdena har ett fel dy så vill man ofta visa mätserien i en plot med felstaplar angivna. För detta kan vi använda kommandot errobar(x,y,dy). Prova till exempel:

»x =[1 2 3 4 5 6];

»y =[1.5 2.4 4.7 7.2 9.3 10.2];

»dy = [0.3 0.4 0.3 0.2 0.3 0.5];

»plot(x,y)

»errorbar(x,y,dy)

Normalt vill vi inte ha någon linje som förbinder punkterna, det blir tydligare att bara plotta punkterna med till exempel en ring. Prova t.ex. errorbar(x,y,dy,'o'), kommandot errorbar accepterar samma parametrar för att styra linjefärg mm som plot gör. Man kan också plotta assymetriska fel genom att ge två vektorer med fel, den första ger då felet i positiv riktining, den andra felet i negativ r i k t n i n g , e t t f u l l s t ä n d i g t k o m m a n d o b l i r i d e t f a l l e t errobar(x,y,dyplus,dyminus,'sträng'). Vill vi rita felstapla i både x- och y-riktning kan vi inte använda inbyggda funktioner. Vi får istället själva först beräkna x- och y-koordinater för felstaplarna och använda kommandot line för att rita linjer i grafen. Detta är inte så svårt, vi kommer senare att titta på det som en övning i att programmera.

6.3 Histogram

Förutom kurvor och punkter med felstaplar kommer vi ofta vilja producera stapelhistogram. Det finns flera varianter att välja på som producerar litet olika typer av grafer. För att kunna pröva oss fram skapar vi först en vektor med data som vi vill stoppa in i histogrammet: x = rand(1,20); ger oss en vektor med 20 tal, vart och ett slumpvis draget mellan 0 och 1.

6.3.1 Kommandot bar - stapeldiagram

Kommandot bar(x) ger oss ett stapeldiagram med de 20 talen. Vi kan själva styra bredden av staplarna genom ett andra argument, prova bar(x,0.2) och bar(x, 1.4)! Som ett tredje argument accepterar bar-kommandot en textsträng som anger vilken färg staplarna skall ha, här använder vi samma kod som för plot-kommandot.

6.3.2 Kommandot hist - histogram

Oftast vill vi nog inte bara plotta värdet för våra 20 tal. Vanligare är att vi vill visa ett histogram som visar till exempel hur många av talen som ligger mellan 0.0 och 0.2 och så vidare. För att göra detta ger vi kommandot hist(x). Om vi inte anger annat delas data upp i 10 binnar, men vi kan ange hur många binnar vi vill visa i ett andra argument till exempel hist(x,5).

Tänker vi efter litet inser vi att kommandot hist egentligen utför två ganska olika uppgifter: I det första steget delas data in i binnar (10 binnar eller det antal som vi anger) som sträcker sig mellan det minsta och högsta värdet. I det andra steget plottas sedan stapeldiagrammet i grafen. Ibland kommer vi att vilja använda bara det första steget för att sedan själva plotta data - eller använda dem i beräkningar.

Det här går bra att göra, om vi ger kommandot som antal = hist(x,8) så skapas vektorn antal som vars element anger hur många av elementen i x som faller inom vart och ett av 8 intervall mellan det lägsta och högsta värdet som förekommer i x. Vi kan även skapa en vektor med mittpunkterna i varje interval genom kommandot [antal mitt] = hist(x,8). Vektorn antal innehåller då frekvensen och vektorn mitt interval-mitten för de 8 intervallen. De vektorerna kan sedan till exempel användas för att plotta punkter istället för histogram med plot(mitt, antal).

När du prövade hist(x,8) fick du antagligen ganska konstiga värden på intervallbredden (och en smal glipa i histogrammets vänsterkant). Detta beror på att hist-kommandot beräknar intrevallbredden genom att dela avståndet mellan högsta x-värdet och lägsta x-värdet med 8, istället för att beräkna intervallbredden som (1-0)/8 vilket hade varit mer naturligt för den här typen av data. För att kunna rätta till sådana skönhetsfläckar kan vi istället för antalet binnar ange var vi vill ha klassmitten i anropet till hist. Vi kan till exempel sätta mycenter = [0.2 : 0.2 : 0.8] följt av hist(x,mycenter). Ett mer allmänt sätt att skapa ett histogram från minvalue till maxvalue med binvidd vidd är att skapa mycenter genom kommandot

mycenter = [minvalue+vidd/2 : vidd : maxvalue-vidd/2]

följt av hist(x,mycenter)

6.3.3 Kommadot stairs - konturdiagram.

Kommandot stairs(x) drar en öppen kontur över elementen i vektorn x. Vi kan ange vid vilket värde det horisontella strecket skall börja med en andra vektor startx: prova startx=(0.05:0.05:1) följt av stairs(x,startx). Vi kan ange linjetyp som en sträng som vi skickar med som tredje argument på samma sätt som för plot-kommandot.

Använt direkt på vår datavektor är stairs ett alternativ till bar-kommadot, men vill vi rita ett histogram med den här tekniken går det också bra, vi måste bara först skapa vektorn antal med hjälp av hist-kommandot som ovan, och sedan ge stairs(antal).

Ett annat nyttigt knep om vi vill att stairs skall dra en linje från nollvärdet upp till första värdet är att lägga till ett element som vi sätter lika med noll först i den vektor vi ger som argument för stairs. På motsvarande sätt kan vi ibland vilja lägga till ett noll-element sist i en vektor för att få ner grafen till noll.

6.3.4 Kommandot stem - stolpdiagram.

Diskreta variabler, som till exempel antal studenter med vissa poäng på tentan kan man rita med kommandot stem. Prova dig fram med hjälp av help stem.

6.4 Utskrifter av grafik

Det enklaste sättet att skriva ut en graf på en printer är att ge kommandot print. Filen kommer då att skrivas ut på default printern 10för datorn. Om du vill ha möjlighet att välja en annan printer så kan man öppna dialogrutan för utskrift genom att ge tillägget (engelska option) -v efter kommandot.

Man kan också använda kommandot print för att "skriva ut till hårddisken", det vill säga skapa en PostScript fil som innehåller vår plot. Detta görs genom att skriva önskat filnamn efter printkommandot. Filen hamnar då i den aktuella katalogen med det namn som ges i print-kommandot.

Det finns en mängd tillägg till print-kommandot som kan användas för att bestämma hur denna fil skall formatteras, skriv help print för att få en översikt. Vissa av tilläggen kan kombineras med varandra, men skriver då helt enkelt in fler tillägg (alla med sitt inledande - tecken) efter varandra.

Men det är inte alla kombinationer som är möjliga samtidigt, MATLAB kommer i så fall att generera ett felmeddelande. Även de kombinationer som är tillåtna kan ibland ge överraskande resultat.

Kommandot print filnamn -v kunde man förvänta sig att det öppnar en dialogruta som tillåter en att spara en fil på valfritt ställe på hårddisken. Men i stället tar tilläget över det faktum att vi har gett ett filnamn i kommandot och vad som händer är i stället att en print-dialogruta öppnas. Det kan alltså finnas anledning att pröva sig fram om man vill använda print på ett mer avancerat sätt.

6.5 Spara grafer och flytta till andra program

Ofta kommer vi att behöva kopiera in en graf vi har producerat i MATLAB i en rapport. Använder vi till exempel Microsoft Word som ordbehandlingsprogram kan vi välja två vägar:

Ofta kommer vi att behöva kopiera in en graf vi har producerat i MATLAB i en rapport. Använder vi till exempel Microsoft Word som ordbehandlingsprogram kan vi välja två vägar:

Related documents