• No results found

Handtags-grafik

9.3 Handtags-grafik

Matlab ger oss m¨ojlighet att i detalj via kommandon styra utseendet av den grafik vi pro-ducerar p˚a ungef¨ar samma s¨att som n¨ar vi arbeter i ”property editor”-f¨onstret. Detta kan vara av v¨arde n¨ar vi producerar grafik i ett program och vill p˚averka utseendet av graferna inifr˚an programmet ist¨allet f¨or att g¨ora det interaktivt. Detta g¨ors med hj¨alp av n˚agot som kallas ”handtagsgrafik” (eng handle graphics). N¨ar vi ¨agnar oss ˚at datorprogrammering s˚a

¨

ar ett ”handtag” en variabel som pekar tillbaks p˚a ett objekt vars egenskaper vi vill kunna p˚averka. Det kan vara en fil vi har ¨oppnat i ett program och som vi vill skriva data till eller st¨anga eller byta namn p˚a, eller som i det h¨ar fallet ett diagram vars egenskaper vi vill kunna

¨

andra. Handtagen skaffar man sig i allm¨anhet i det kommando d¨ar objektet i fr˚aga skapas, s˚a t.ex. kan vi i matlab skaffa ett handtag till en plot genom att ge plotkommandot p˚a formen handtag1=plot(x,y). Detta ger oss ett handtag som vi sedan kan anv¨anda dels f¨or att skaffa oss information om grafer, dels ¨andra variabel v¨arden, och d¨armed egenskaper hos grafen. Handtagsgrafik ¨ar i sig en sk¨on konst, vi kan inte g¨or mer ¨an skrapa p˚a ytan h¨ar, f¨or en mer fullst¨andig beskrivning h¨anvisar vi till ?MATLAB/Graphics/Handle Graphics Objects

9.3.1 Linjens egenskaper

De egenskaper vi f˚ar tillg˚ang till genom det handtag vi skapar n¨ar vi ger plotkomman-dot ¨ar linjens egenskaper. Pr¨ova att i exemplet ovan skriva det sista plotkommandot som hand1=plot(xvalues, gvalue, ’b*’). Om vi sedan skriver get(hand1) i kommandof¨onstret s˚a f˚ar vi en lista p˚a de egenskaper hos detta objekt som vi kan ¨andra. De mest intressanta

¨

ar de som kommer f¨orst:

get(hand1)

Med hj¨alp av handtaget kan vi s¨atta dessa egenskaper med hj¨alp av kommandot set(handtag, egenskap, v¨arde) (man kan ge fler par av egenskap-v¨arde efter varandra). Prova till exem-pel effekten av set(hand1,’Markersize’,25), set(hand1,’Marker’,’o’, ’MarkerSize’,8), set(hand1,’LineStyle’,’-.’). Egenskapen Color, som ¨ar f¨argen p˚a linjesegment och punktmark¨orer ges som en vektor som anger hur stor br˚akdel mellan 0 och 1 av de tre grundf¨argerna som skall blandas i den f¨arg vi vill se. Vektorn anger grundf¨argerna i ordnin-gen r¨ott-gr¨ont-bl˚att. Svart ges av [0 0 0] medan vitt ¨ar [1 1 1], m¨orkgr¨ont ¨ar [0 0.4 0] och s˚a vidare. Prova att blanda litet olika kombinationer, f¨or att se ordentligt kanske du vill dra upp linjebredden litet: set(hand1,’LineWidth’,4,’Color’,[.2 .7.2]).

9.3.2 Axlarnas egenskaper

Vi kan f˚a motsvarande lista ¨over egenskaperna hos axlarna i den aktuella plotten genom kommandot hand2=gca, f¨oljt av get(hand2) (gca st˚ar f¨or ”get current axis” vilket

¨

ar detsamma som handtaget till de nuvarande axlarna). Listan vi f˚ar ¨ar l˚ang, f¨or en fullst¨andig genomg˚ang h¨anvisar vi till dokumentationen, h¨ar g¨or vi n˚agra nedslag bland de mer anv¨andbara:

Box = on - L˚ater oss sl˚a p˚a (on) eller av (off) den heldragna boxen kring grafen.

Color = [1 1 1] - Styr bakgrundsf¨argen i plotten.

FontAngle = normal - Kan anv¨andas f¨or att skriva axlarna (allts˚a siffrorna, inte etiketter) kursiverat genom att ge ”italic”.

FontName = Helvetica - Byter typsnitt p˚a axlarna.

FontSize = [10] - V¨aljer storlek p˚a axlarnas siffror.

LineWidth = [0.5] - S¨atter bredden p˚a de linjer som ritar axlar och axelmark-eringar.

TickLength = [0.01 0.025] - S¨atter l¨angd p˚a axelmarkeringarna.

TickDir = in - Avg¨or om axelmarkeringarna skall peka in i grafen (in) eller ut ur den (out).

Det finns ett antal variabler som ges i formen XLabel = [7.00012]

Detta ¨ar helt enkelt ocks˚a ett handtag som pekar p˚a egenskaperna hos objektet XLabel, det vill s¨aga dataetiketten p˚a x-axeln. Egenskaperna hos detta objekt syns inte bland axlarnas egenskaper, f¨or att se dessa m˚aste vi g¨ora get med detta handtag. Det finns dock en hake - vi kan oftast inte skriva bara get(7.00012), eftersom det tal vi ser ¨ar avrundat. F¨or att vara s¨aker p˚a att vi f˚ar r¨att handtag b¨or vi anv¨anda get-kommandot:

labelx=get(gca,’Xlabel’) f¨oljt av get(labelx) som ger oss en ny lista med egenskaper, denna g˚ang enbart f¨or data-etiketten f¨or x-axeln, som vi kan ¨andra efter behag f¨or att skr¨addarsy grafens egenskaper.

9.3.3 Figurens egenskaper

Man kan ocks˚a kalla fram egenskaperna hos figuren genom get(gcf) (gcf: get current figure).

Det ¨ar ganska f˚a av de intressanta egenskaperna hos figuren som inte enklare g˚ar att st¨alla p˚a annat s¨att, men vi kan i alla fall ¨andra bakgrundsf¨argen - allts˚a bakgrunden till figuren, inte bakgrunden i figuren - genom att ge set(gcf,’Color’,[0.9 0.7 0.7]).

9.4 3-D grafik

Tre-dimensionell grafik ¨ar ju n˚agot av en h¨agring, eftersom vi alltid f˚ar h˚alla tillgodo med tv˚ a-dimensionella projektioner av kroppar och ytor i den trea-dimensionella rymden. MATLAB hj¨alper oss att skapa s˚adana h¨agringar p˚a flera olika s¨att. Vi skummar litet p˚a ytan, och h¨anvisar den som beh¨over en grundlig genomg˚ang till ?/MATLAB/3-DVisualization.

9.4.1 Kurvor i rymden - plot3

Kommandot plot3(x,y,z,s) fungerar ekvivalent med kommandot plot i tv˚a dimen-sioner. Om x, y och z ¨ar vektorer (med samma l¨angd) s˚a plottas kurvan mellan punkterna, str¨angen s styr linjens utseende och har samma format som f¨or plot-kommandot. Argumenten x, y och z kan ocks˚a vara matriser av samma storlek, kommandot plottar d˚a en kurva f¨or varje kolumn i matriserna. Vill man ha fler kurvor i samma graf, men med olika antal punkter, eller med olika egenskaper hos linjen kan man ge kommandot p˚a formen plot3(x1, y1, z1, s1, x2, y2, z3, s2,...). I ¨ovrigt fungerar de flesta kommandon som kan anv¨andas p˚a en tv˚adimensionell plot ocks˚a h¨ar:

9.4. 3-D GRAFIK 95

clear all;

z=1:pi/32:2*pi;

y=sin(z);

x=cos(z);

plot3(x,y,z,’r’) xlabel(’cos(t)’) ylabel(’sin(t)’) zlabel(’t’) grid on

title(’Helix i tre dimensioner’)

I grafikf¨onstret kan vi rotera grafen f¨or att betrakta den ur valfritt perspektiv. Tryck ned knappen “Rotate 3D” (den som har en cirkul¨ar pil runt en kub). Mark¨oren ¨andras d˚a till en cirkul¨ar pil. Om vi trycker ned musknappen med mark¨oren n˚agonstans i grafikf¨onstret och drar kommer grafen att rotera. Pr¨ova!

9.4.2 Funktionsytor - mesh och surf

Funktionsytor kan ˚ask˚adligg¨oras p˚a tv˚a s¨att, antingen som ett galler eller som en hel yta.

Innan vi ger oss h¨an m˚aste vi, i analogi med hur vi f¨orst skapade en x-vektor f¨or att g¨ora en tv˚adimensionell plot av en funktion skaffa oss ett x-y galler d¨ar funktionen skall utv¨arderas.

Detta g¨ors med kommandot [x, y] = meshgrid(xintervall, yintervall) som ger tv˚a matriser x och y som inneh˚aller koordinaterna f¨or varje punkt d¨ar funktionen skall utv¨arderas.

Prova till exempel:

clear all;

clf figure(1) xkoord=-8:.1:4;

ykoord=-4:.1:8;

[x, y]=meshgrid(xkoord, ykoord);

z=sin(sqrt(x.∧2+y.∧2));

mesh(x,y,z);

figure(2) surf(x,y,z);

9.4.3 Att styra utseendet av en 3D-graf Perspektiv

F¨orutom att l¨agga till axel-rubriker och titlar, och ¨andra axlarna gradering som f¨or en tv˚adimensionell graf (och naturligtvis hela batteriet med manipuleringar som handtags-grafiken ¨oppnar upp) s˚a finns det n˚agra speciella funktioner f¨or en 3D-graf. En ¨ar komman-dot view som anger ur vilken riktning vi betraktar en graf. Denna anges med tv˚a vinklar (i grader): theta och phi. Theta ¨ar vinkeln mellan x-axeln och det plan i vilket grafen lig-ger. Theta=0 anger att x-axeln l¨oper parallellt med bildytan, och att y-axeln pekar in˚at i grafen (ser inget vidare ut!). Phi-vinkeln anger den vinkel som synlinjen bildar med horison-talplanet, phi=0 anger att vi ser p˚a grafen horisontellt fr˚an sidan, phi=90 att vi betraktar det hela rakt ovanifr˚an. Dessa vinklar kan man ¨andra genom kommandot view(theta,phi).

Det ¨ar l¨att att g˚a bort sig n¨ar man b¨orjar ¨andra denna vinkel, vill man komma tillbaks till det normala v¨ardet (theta = -37.5, phi = 30) skriver man view(3). Om man i n˚agot l¨age blir os¨aker om vilka v¨arden som g¨aller kan man ”fr˚aga” genom kommandot [theta, phi]

= view.

F¨argskala

F¨or att rita in en f¨argkarta som anger vilken f¨arg som svarar mot vilket v¨arde ger man kommandot colorbar. Skalan l¨aggs vertikalt om du inte ger n˚agot argument, eller om du ger

’vertical’. Vill du ha en liggande skala ger du colorbar(’horizontal’). Tycker man inte att f¨args¨attningen duger s˚a finns det ett antal olika f¨argkartor att v¨alja p˚a - skriv help graph3d och titta p˚a colormap f¨or att se vilka du kan v¨alja mellan. Du ¨andrar f¨argskala genom kommandot colormap mapname. Om vi inte tycker om det ¨overlagrade svarta rutm¨onstret s˚a kan det tas bort med kommandot shading. Det normala utseendet f˚as med shading faceted, en variant d¨ar varje ruta har en f¨arg, men utan att visa n¨atet f˚as med shading flat. Vi kan slutligen f˚a en utj¨amnad f¨args¨attning utan rutn¨at med shading interp.

Har vi gjort en snygg f¨argad yta kan det ibland vara effektfullt (men oftast inte s¨arskilt informativt) att helt fril¨agga den innan vi klipper in den i n˚agot annat program. Det g¨ors genom grid off och axis off.

9.4.4 Konturplottar och projektioner

Vi kan rita konturplottar med kommandot contour(z), antalet niv˚aer kan styras med ett andra argument, och linjetyp v¨aljs som vanligt: contour(z,12,’r’). Som du ser s˚a ¨ar de v¨arden som ges p˚a axlarna index i respektive matris, inte sj¨alva v¨ardet, detta kan vi

˚atg¨arda genom att g¨ora en tilldelning av v¨arden n¨ar vi kallar contour: contour(-8:.1:4, -4:.1:8, z, 12) ger oss tillbaka v˚ar gamla vanliga kakform. I denna plot kan vi rita in h¨ojdv¨arden med kommandot clabel med contour kommandot som argument:

clabel(contour(z, 12)) . Vi kan ocks˚a f˚a en f¨argkodad projektion med pcolor(x,y,z).

Med rutn¨atet p˚aslaget blir det inte s¨arskilt elegant, varf¨or man kanske vill f¨olja upp med shading interp.

9.4.5 Gradientplottar

F¨or att g¨ora genomg˚angen komplett visar vi kokboksm¨assigt hur man kan konstruera en 2-dimensionell figur som visar gradienten av en funktion av tv˚a variabler. Vi konstruerar f¨orst v˚ar vektor z med n˚agot gr¨ovre indelning ¨an tidigare, eftersom gradientpilarna som visas med samma granularitet som z ber¨aknas i annars blir helt o¨oversk˚adliga.

clear all;

xkoord=-4:.5:4;

ykoord=-4:.5:4;

[x,y]=meshgrid(xkoord, ykoord);

z=sin(sqrt(x.∧2+y.∧2));

[dx,dy]=gradient(z,0.5,0.5);

contour(-4:.5:4,-4:.5:4,z) hold on

quiver(x,y,dx,dy,0.5)

Kommandot gradient ber¨aknar gradienten av funktionen z i samma punkter som funktio-nen ¨ar ber¨aknad, quiver slutligen plottar sm˚a pilar i punkterna som ges av x och y med riktning som ges av dx och dy. Det sista argumentet i quiver-kommandot ¨ar en skalfaktor.

Ger vi ingen skalfaktor s˚a g¨ors pilarna lagom stora f¨or att precis f˚a plats, en skalfaktor som ¨ar mindre ¨an 1 ger litet mer luft mellan pilarna. F¨or mer info h¨anvisar vi till help gradient och help quiver.