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]