MATLAB-opas, grafiikkaa
Päivitys: 20.8.2019
Oppaan etusivu
Grafiikkasivun sisällys
plot | subplot |
Kompleksipiirto plot:lla | fplot | parametrimuotoinen piirto plot:lla
plot3: avaruuskäyrät
| mesh,surf,contour:pinnat ja korkeuskäyrät
MATLAB sisältää monipuoliset piirtokomennot datan 2- ja
3-ulotteiseen visualisoimiseen.
Komennon plot perusmuoto
Tässä on Mathworks'n ohjeet:
>>doc plot ja >>doc plot3
Funktio plot toimii periaatteella:"Yhdistä xy-datapisteet niiden kautta kulkevalla murtoviivalla" !
Esimerkiksi:
>> x=[1.5 2.2 3.1 4.6 5.7 6.3 9.4];
>> y=[2.3 3.9 4.3 7.2 4.5 6.1 1.1];
>> plot(x,y);grid on
Käyrien piirtäminen
Käyrät piirrretään diskretoimalla riittävän tiheästi plot-komennolle annettava data.
Ajatellaan, että haluamme piirtää käyrän
\(y=x^3-2x+1\)
välillä [-2,2].
Muuttujaksi x otetaan sataan osaan
diskretoitu x-akselin väli.
» x=linspace(-2,2,100);
Luvun 100 voi jättää pois, sillä 100 on oletusarvo.
Lasketaan y-vektoriin vastaavat funktion arvot.
Huomaa (.^)
» y=x.^3-2*x+1;
Komento
» plot(x,y)
piirtää siis x-vektorin ja y-vektorin vastinkomponenttien ilmaisemien
koordinaattipisteiden
(x(i),y(i)),
määräämän murtoviivan.
Kun pisteitä
on tarpeeksi (usein 100 riittää), saadaan sileä käyrä
kuvaksi.
Kokeile minkälaisen käyrän saat jos 100:n sijasta käytät arvoa 10.
Koordinaatisto muodostuu automaattisesti niin, että kaikki piirtodata juuri mahtuun kuvaan.
Kuvan skaalausta voi muuttaa komennolla axis([xmin xmax ymin ymax]) , kts: axis.
axis-komennon argumenttina
voi olla myös erinäisiä merkkijonoja, joista useimmin tarvittavia lienevät
axis('equal'), axis('square'). Alkutilaan päästään
komennolla axis('normal').
axis('equal') ja axis('square'), jotka muuten voi
antaa myös tyyliin axis equal, ovat erityisen tarpeellisia
silloin, kun halutaan esim. ympyrän näyttävän ympyrältä.
xlim, ylim -komenoilla muutetaan vain x- tai y-akselin rajoja.
Kokeile miten äsken saamasi kuva muuttuu kun käytät yllä mainittuja
axis-komennon eri muotoja.
Kuvaa voi käsitellä kuvaikkunan työkalunauhan valikosta näkyvillä
tavoilla.
Sitä voi "zoomata" (suurennuslasi), kuvaan voi lisätä tekstejä
(insert-valikosta "text") jne.
Samoja asioita voi hoitaa myös komennoilla, kuten zoom on.
Jos haluat piirtää toisen käyrän jo olemassaolevaan kuvaan, niin anna
komento hold on. Tämän jälkeen kaikki seuraavat
käyrät tulevat edellisten 'päälle', kunnes annetaan komento hold
off.
Piirrä yllä saadun käyrän kanssa samaan kuvaan
$$y=2\cos(x^2-5x+17).$$
Toinen tapa usean käyrän piirtämiseksi samaan kuvaan on
plot-komennon muoto
plot(x1,y1,x2,y2,x3,y3,...). plot-komennossa
voi lisätä viivatyyppimääreen kullekin haluamalleen käyrälle.
Jos
haluttaisiin vaikkapa piirtää sinikäyrä sinisellä, kosinikäyrä
katkoviivalla ja lisäksi merkitä jälkimmäiselle rinkuloilla kaikki
/2:n monikerrat välillä [0,10], olisi
sopivaa tehdä näin:
» x=linspace(0,10);
» x1=0:pi/2:10;
» plot(x,sin(x),'b',x,cos(x),'--',x1,cos(x1),'o')
» grid
Huom 1: plot(x1,cos(x1),'o') ('o' :n sijalla käy
esim. 'x' tai '.') piirtää vain ao. pisteet, mutta jättää
yhdistysjanat piirtämättä.
+++** Taulukko kaikista markkerityypeistä **+++
Huom 2: Yleinen muoto on
plot(x1,y1,'mjono1',x2,y2,'mjono2',x3,y3,...), missä 'mjono1',
'mjono2',... ovat yllä esiintyvän tyylisiä merkkijonoja, joilla ilmaistaan
väri tai viivatyyppi.
Argumentit voidaan mieltää kolmikoiksi, yksi kolmikko
kutakin piirrettävää käyrää kohti. Mistä tahansa kolmikosta voidaan jättää
merkkijono-osa pois, jolloin ko. käyrä piirretään oletusvärillä ja -tyypillä.
Komennolla grid- voidaan kuvaan lisätä
koordinaatti- (hila-) viivat, mikä on usein hyödyllistä.
Kokeile joitakin yllä
esitetyn kaltaisia yhdistelmiä.
Uuden piirtoikkunan saa avatuksi komennolla figure.
Piirtoikkunoilla on numero, jonka avulla useista ikkunoista voidaan
valita se, johon halutaan piirtää: komento figure(n), missä
n on ikkunan numero,
figure(2) ohjaa seuraavat piirrokset ikkunaan
n.
Yllä mainitussa
YAGTOM-oppaassa kohdassa "Plotting curves" on tyylinäyte yksinkertaisen peruspiirroksen metamorfoosista lisävalitsimien
avulla tyylikkääksi graafiseksi esitykseksi.
Grafiikkaruudun jakaminen osiin, subplot
Komento
subplot(m,n,p) jakaa kuvaikkunan mxn-"kuvamatriisiksi", jossa seuraava piirtokomento kohdistuu p:nteen pikkuruutuun, kun edetään riveittäin.
ESIM:
subplot(2,1,1); % 2x1-"matriisin" ruutu 1.
x = linspace(0,10);
y1 = sin(x);
plot(x,y1)
subplot(2,1,2); % 2x1-"matriisin" ruutu 2.
y2 = sin(5*x);
plot(x,y2)
Tehtävä: Piirrä osaruudut viererekkäin!
Piirtämishuomioita
Funktiossa
linspace on
oletusarvona jako sataan osaan, mikä on usein sopiva
2D-piirroksiin.
Tavallisimmin piirto tehdään siten tähän tapaan:
» x=linspace(a,b); % a:lla ja b:llä oltava numeeriset arvot.
» y=lauseke; % Esim y=exp(sin(x))+x.^3;
» plot(x,y)
Toinen tapa x-diskretointiin on antaa jakovälien lukumäärän sijasta
jakovälin
pituus h,
jolloin kirjoitettaisiin >> x=a:h:b;
Yllä kannattaa panna merkille puolipisteen käyttö, joka säästää
tarpeettomalta pitkän vektorin tulostukselta.
|
Yhteenveto käyrän ja (x,y)-taulukon piirtämisestä
|
|---|
-
Muodostetaan vektorit x ja y. Ne voivat olla annettua dataa tai y-arvot
ovat tarkasteltavan funktion arvoja x-pisteissä.
-
plot(x,y) piirtää tasoon (xi,yi)-pisteet yhdistävän murtoviivan.
-
plot(x,y,'o') piirtää pelkät pisteet ilman yhdistysjanoja
käyttäen 'o'-merkkejä.
-
plot(x,y,x,y,'o') piirtää murtoviivan ja pisteet 'o'-merkillä.
grid on : Koordinaattiviivat (suosittelen yleensä).
|
|
Yhteenveto grafiikkaikkunoiden hallinnasta
|
|---|
-
hold on aiheuttaa edellä piirretyn kuvan jäädyttämisen,
jolloin seuraavat piirtokomennot piirtävät edellisen kuvan päälle.
Takaisin "pyyhkimistilaan": hold off
-
figure avaa uuden kuvaikkunan. Jos halutaan jatkaa
piirtämistä aiemmassa tai uudessa ikkunassa, voidaan komentaa esim.
figure(2)
- shg "show graphics" tuo viimeisen grafiikkaikkunan esiin.
- clf "clear figure" tyhjentää grafiikkaikkunan
"vanhasta roskasta".
- close all hävittää kaikki grafiikkaikkunat. Usein hyödyllinen skriptitiedoston alussa.
- subplot(m,n,p) ruudun jako (m,n)- "kuvamatriisiksi", seuraava piirtokomento kohdistuu rutuun no. p.
|
Kompleksilukujen piirto
Piirtofunktion plot argumentiksi voidaan antaa myös
kompleksiluku(vektori) z=[z1,z2, ...,zn] .
Tällöin ohjelma piirtää näiden tason pisteiden määräämän murtoviivan tasoon, ts.
plot(z) toimii samoin kuin plot(real(z),imag(z))
Esim
Piirrä kompleksitasoon pisteet 0,1,1+i,i.
>> plot([0,1,1+i,i,0])
>> axis([-.2 1.2 -.2 1.2]) % Väljennetään akseleita
>> hold on % Pidetään edellinen
>> plot([0,1,1+i,i,0],'x') % Nurkkapisteet x:llä
Tehtävä: Muistele De Moivre'n kaavaa:
\[e^{i\phi} = \cos(\phi) + i\, \sin(\phi). \]
Piirrä tätä hyväksi käyttäen yksikköympyrä kompleksitasoon.
Vihje: Muodosta vektori phi=linspace(0,2*pi); ja sitten vain
z-vektori.
Matlab-funktion piirto, fplot
fplot on vaihtoehtoinen tapa funktion
piirtämiseen. Tällöin funktion on oltava joko MATLAB-funktio (kuten
sin, cos, exp, ...) tai itse määritelty
funktio (joko m-tiedosto tai ns. funktiokahva tai vanhanaikainen "inline"-määrittely).
Esim: fplot(@sin,[0,2*pi]) tekee saman kuin
x=linspace(0,2*pi);plot(x,sin(x)). Erona on se, että fplot
suorittaa ns. adaptiivisen diskretoinnin, joka mahdollistaa tarkan kuvan
vähemmällä laskentatyöllä. (Toki adaptiivisyydelläkin on "hintansa", koska se haittaa "vektorointia".)
>> f=@(x) x.^2 % Lue: f="at(x), x toiseen", vrt: f=x->x^2 (Maple)
>> fplot(f,[0,1])
Tai voitaisiin käyttää "nimetöntä funktiotyyliä":
>> fplot(@(x) x.^2,[0 1])
Parametrimuotoiset käyrät tasossa
Funktio plot soveltuu sellaisenaan parametrimuotoiseen piirtoon.
Ajatellaanpa yksinkertaisimpana esimerkkinä ympyrää, jonka luonnollinen
parametriesitys on
\(x=cos(t), y=sin(t), t \in \left[0,2\pi\right]\)
>> t=linspace(0,2*pi);
>> x=cos(t); y=sin(t);
>> plot(x,y)
>> axis equal; axis square;
Tätä sopii verrata yllä olevaan kompleksipiirtoon.
Esimerkkejä +++**LISÄÄ **+++
Avaruuskäyrät
Parametrimuodossa annettuja avaruuskäyriä voidaan piirtää funktiolla
plot3 lisäämällä z-koordinaatti mukaan.
Esimerkki selvittäköön asian.
Jatketaan parametripiirtoesimerkkiä ottamalla mukaan z-koordinaatti, joka
nousee lineaarisesti kulman t funktiona. Toisin sanoen piirrämme
ruuviviivan:
$$x=cos(t), y=sin(t), z=t, t \in \left[0,6\pi\right]$$
>> t=linspace(0,6*pi);
>> x=cos(t); y=sin(t); z=t;
>> plot3(x,y,z)
>> axis equal; axis square;
>> grid
Tämä on periaatteessa sama esimerkki kuin funktion plot3
avustussivulla. Kuvakin näkyy siellä (tosin hiukan eri parametrein).
Kts. myös: Various views of meshgrid
Olkoon piirrettävänä funktion
f(x,y)=e-x2-y2
määrittelemä pinta(pala) xy-tason neliön [-2,2] x [-2,2] alueella.
Ajatus on, että jaetaan alue koordinaattiviivoilla suorakulmiohilaksi
ja lasketaan kussakin hilapisteessä (xi, yj)
funktion arvo zi,j=f(xi, yj).
Näin saadaan korkeusmatriisi Z=(zi,j).
Ajatellaan, että asetetaan kuhunkin hilapisteeseen
(xi, yj) sauva, jonka (merkillä varustettu)
pituus on
zi,j.
Näin syntyneen "sauvametsän" päällee asetetaan lepäämään "pintamatto".
Sama korkeusmatriisi soveltuu niin
pinta- (surf), korkeuskäyrä-
(contour) kuin yhdistelmäkuviin
(surfc).
» x=-2:.1:2; y=x; % x-ja y-akselin diskretoinnit tässä samoja.
» [X,Y]=meshgrid(x,y); % X ja Y määräävät xy-alueen hilapisteistön.
» size(X), size(Y)
ans =
41 41
ans =
41 41
» Z=exp(-X.^2-Y.^2); % Korkeusmatriisin arvot hilapisteissä.
% Huomaa "pisteittäiset" laskutoimitukset.
» surf(x,y,Z) % surf-funktio "asettaa maton
% sauvametsän päälle".
>> contour(x,y,Z) % Korkeuskäyräpiirros
>> ezcontour('exp(-x^2 - y^2)',[-2 2 -2 2]) % "easycontour", ei tarvita
>> % meshgridiä eikä "vektorointipisteitä".
Demonstroidaan view-komentoa:
» for j=1:5;view(-20+10*j,20*j),pause,end;
Kuvan pyörittäminen käy vuorovaikutteisemmin kuvaikkunan työkalunauhan
oikeanpuolimmaisesta painikkeesta.
Kts. myös: Various views of meshgrid
Kyseessä on monikäyttöinen ja tehokas (ja välttämätön) komento erityisesti
pinta-ja korkeuskäyräpiirroksissa. Kuten todettu, funktion f(x,y) pintaa ym. varten tarvittava data koostuu matriisista Z=(zij), missä
zij = f(xi, yj), kun pisteet xi
ja yj muodostavat x-alueen (vast. y-alueen) diskretoinnin.
&matlab;:ssa voitaisiin toimia näin:
>> x=linspace(a,b,m); y=linspace(c,d,n);
>> Z=zeros(m,n);
>> for i=1:m
for j=1:n
Z(i,j)=f(x(i),y(j));
end
end
Sitten vaan: >> surf(x,y,Z') . (Miksi pitää transponoida, no mesh-,
surf- ym. komennoissa ajatellaan koordinaatistoa eikä matriisin indeksejä.)
Tällainen kävisi ajan oloon hermoille (eikö vaan?). (Sekä tehotonta että vaivalloista.) Pelastuksen tarjoaa meshgrid.
Kokeillaan:
>> x=0:3
x =
0 1 2 3
>> y=-(0:2)
y =
0 -1 -2
>> [X,Y]=meshgrid(x,y)
X =
0 1 2 3
0 1 2 3
0 1 2 3
Y =
0 0 0 0
-1 -1 -1 -1
-2 -2 -2 -2
Matriisit X ja Y ovat samankokoiset.
-
X koostuu x-riveistä allekkain. Niitä
on n kpl., n = y:n pituus.
-
Y koostuu y-sarakkeista vierekkäin, niitä on m kpl., m = x:n pituus
Kun f on vektoroidusti määritelty funktio ("array smart"), niin
Z=f(X,Y) on matriisi, jolle todellakin Zij = f(xi,
yj).
Kun komennot mesh, surf, contour kirjoitetaan muodossa
mesh(x,y,Z), ..., &matlab; antaa myös oikean koordinaatiston. Jos annetaan
pelkkä matriisi Z, piirto tapahtuu matriisin Z indeksejä käyttäen aivan
samoin kuin 2d plot-funktion tapauksessa.
Hilapisteet voi piirtää näppärästi:
>> plot(X(:),Y(:),'o')
>> axis([-0.1 3.1 -2.1 .1])
Tee ja tee (selväksi).
Hilaruudukon taas näin:
>> plot(X,Y)
>> hold on
>> plot(X',Y')
(Aikamoista &matlab;-iloittelua!)
Pinta ympyräalueen päällä
Edellä oleva pintapiirto tuntuu olevan kovasti suorakulmioalueeseen
rajoittuvaa. Mutta &matlab; on moneen taipuva työkalu. Mietitäänpä ympyräaluetta. Miten voitaisiin käyttää napakoordinaattimuunnosta hyödyksi. No
kokeillaan funktiota f(x,y) = x y yksikkökiekon päällä.
>> t=linspace(0,2*pi,30);
>> r=linspace(0,1,10);
>> X=r'*cos(t);Y=r'*sin(t); % Ulkotulot
>> Z=X.*Y;
>> surf(X,Y,Z)
>> surfc(X,Y,Z)
>> hold on
>> surf(X,Y,zeros(size(Z)))
EI HUONO!
Ruuviviiva lieriön pinnalla
Tässä on Nancy K. Stanton'n (Stanford University) materiaalista poimittu esimerkki:
Tiedosto helix.m:
%% Helix on a cylinder
%%
% Here is a way to plot a helix on a cylinder.
% It will use a parametric description of the cylinder. The cylinder is a
% right circular cylinder of radius 1 centered on the z-axis. It is the
% set of all points of the form
%%
%
$$(\cos(U),\sin(U),V),\qquad 0 \le U \le 2\pi,\quad \mbox{--}\infty < V < \infty. $$
%
% I'll limit the graph to
%%
%
$$ 0 \le V \le 6\pi.$$
%
% I begin by making a 50x50 mesh of the points [U,V] I'll use in the graph.
u=linspace(0,2*pi,50); v=linspace(0,6*pi,50);
[U,V]=meshgrid(u,v);
%%
% To be able to get a thick curve for the helix, I use the *plot3*
% command. I plot the helix as a very thick curve and use the command
% *surf* to plot the cylinder.
% The command *colormap white* prevents shading of the cylinder.
t=linspace(0,6*pi,300);
plot3(cos(t),sin(t),t,'LineWidth',3), hold on
title('Helix on a cylinder')
surf(cos(U),sin(U),V), colormap white, hold off
Jos lataat tämän m-tiedoston itsellesi (vaikka copy/paste) ja avaat sen Matlabin editorissa ja painat "Publish"-välilehteä, ja suoritat "publish", saat tällaisen tällaisen
html-dokumentin.
Tässä on toinen esimerkki ympyräalueelle taipuvasta pintapiirroksesta yhdistettynä 3d-käyrän piirtoon plot3-funktiolla.
Lisäksi nähdään malli m-tiedoston rakenteesta, jolla publish-työkalu tekee
hienon dokumentin aina matemaattisia $\LaTeX$-kaavoja myöten. (Vielä hienomman saat avaamalla m-tiedoston "LIVE scriptinä" ja tulostamalla ajon pdf-tiedostoksi.)
m-tiedostoista ja niiden kirjoittamisesta Publish-työkalulle sopivaan muotoon
puhutaan seuraavassa kohdassa. Tämä toimikoon hyvänä pohjana.
[Edellinen]
[Seuraava]
[Alkusivu]