Predavanje 7: Glave 20, 23 i 24

FlipView[{Text[Style[" Branko Urošević, imqfbrankourosevic@gmail.com ",20,"Text",Italic]],Text[Style[" Faculty of Economics, University of Belgrade, NBS and CESIfo Munich",20,"Text", Italic]]}]

20. Opcije za vizualni prikaz (Options on visual appearence)

Uvod u opcije za vizualni prikaz

Generalno, opcije se pojavljuju u najvećem broju funkcija. Uglavnom, postoji skoro uvek defoltna opcija i to je vrlo često Automatic. A onda možemo “ručno” da stvari modifikujemo kako želimo da izgledaju. Opcije se tipično unose posle zareza u funkcije i imaju oblik 

            x -> y

WL ima ogromnu fleksibilnost u pogledu izbora opcija, a možemo uključivati opcije i kada pišemo svoje funkcije. Ideja je da ipak imamo relativno ograničen broj funkcija u sistemu i da se pomoću opcija grupišu one koje rade slične stvari.

Na primer, kada pravite plot, ako koristite PlotTheme->”Web” dobićete grafik koji lepo izgleda na webu. Na tastaturi, strelica -> se automatski formira ukoliko otkucate  -> (tj. - i >). 

Na primer, standardni plot, bez opcija, daje:

ListLinePlot[RandomInteger[10,10]]

PlotTheme opcije

Koristimo sada PlotTheme opciju “Web”:

ListLinePlot[RandomInteger[10,10],PlotTheme->"Web"]

Evo i PlotTheme sa opcijom “Detailed”:

ListLinePlot[RandomInteger[10,10],PlotTheme->"Detailed"]

A evo i plot opcije PlotTheme -> “Marketing”:

ListLinePlot[RandomInteger[10,10],PlotTheme->"Marketing"]

Možete dodati više opcija. Na primer: Filling specifikuje šta treba da se osenči na grafiku:

ListLinePlot[RandomInteger[10,10],PlotTheme->"Web", Filling-> Axis]

PlotTheme radi i kod mnogih drugih tipova grafika: BarChart

Koristimo sada PlotTheme opciju “Marketing”:

BarChart[RandomInteger[10,10],PlotTheme->"Marketing"]

Evo i PlotTheme sa opcijom “Detailed”:

BarChart[RandomInteger[10,10],PlotTheme->"Detailed"]

A evo i plot opcije PlotTheme -> “Marketing”:

Background i Filling opcije

Background daje mogućnost da specifikujemo pozadinu. Na primer ovako:

ListLinePlot[RandomInteger[10,10],PlotTheme->"Web", Background->LightBlue]

Vidimo da je u ovom slučaju pozadina svetloplava svuda. Pretpostavimo da želimo da ispod grafika pozadina bude svetlije varijante iste boje koju nudi “Web” opcija,

ListLinePlot[RandomInteger[10,10],PlotTheme->"Web", Filling->Axis]

Najzad, možemo kombinovati obe opcije ovako:

ListLinePlot[RandomInteger[10,10],PlotTheme->"Web", Filling->Axis,Background->LightBlue]

Ako ne specifikujete nikakve opcije, WL uzima defolt opcije. Najčešča defolt opcija je Automatic, što znači da WL sam odredi šta je najbolje.

PlotRange - raspon grafika po vertikalnoj osi

Jedna opcija koja je veoma korisna jeste PlotRange. Ona specifikuje u kom opsegu koordinata treba da bude grafik. Opcija PlotRange->All prikazuje sve vrednosti.

Ako ne specifikujemo tu ništa prikazuje se sve osim “outlier” vrednosti:

ListLinePlot[{36,16,9,64,1,340,36,0,49,81}]

ListLinePlot[{36,16,9,64,1,340,36,0,49,81},PlotRange->All]

Još o PlotRange

PlotRange->30 prikazuje vrednosti do 30:

ListLinePlot[{36,16,9,64,1,340,36,0,49,81},PlotRange->30]

PlotRange->{20, 100} određuje da će biti prikazane vrednosti u opstegu između 20 i 100:

ListLinePlot[{36,16,9,64,1,340,36,0,49,81},PlotRange->{20,100}]

Evo kombinacije više opcija

ListLinePlot[{36,16,9,64,1,340,36,0,49,81},PlotRange->{20,150},PlotTheme->"Web", Filling->Axis,Background->LightBlue]

Plot funkcija služi za crtanje grafika funkcija u 2D

Plot funkcija pomaže da se crtaju grafici funkcija. Evo kako to radi:

Plot[x-2 x^2+x^3,{x,-10,10}]

I ovde imamo slične opcije kao ranije. Na primer:

Plot[x-2 x^2+x^3,{x,-10,10},PlotTheme->"Detailed"]

Možemo prikazati više od jednog grafika funkcije odjednom:

Plot[{x-2 x^2+x^3,x^2-1},{x,-10,10},PlotTheme->"Detailed"]

Vidimo da program automatski bira različite boje za grafike. Kako možemo da kontrolišemo boje, videćemo kasnije. Važno je napomenuti da neke opcije ne ostavljaju mogućnost da neke druge budu uključene, pa moramo biti pažljivi oko toga šta želimo da postignemo.

Primetimo da je Plot grafička funkcija iza koje stoji izbor gomile tačaka koje se spajaju pravom linijom.

FullForm[Plot[x-2 x^2+x^3,{x,-10,10}]]

Odnos vertikalne i horizontalne ose: AspectRatio

Neke opcije su slične za sve grafike. Na primer, AspectRatio određuje globalni oblik grafika, naime racio njegove visine i dužine. Na taj način, ova opcija rasteže ili spljoštava grafike. Sa AspectRatio-> 1/3, grafik je tri puta širi nego što je visok:

ListLinePlot[{36,16,9,64,1,340,36,0,49,81},PlotTheme->"Web", Filling-> Axis,AspectRatio->1/3]

ListLinePlot[{36,16,9,64,1,340,36,0,49,81},PlotTheme->"Web", Filling-> Axis,AspectRatio->1/2]

ListLinePlot[{36,16,9,64,1,340,36,0,49,81},PlotTheme->"Web", Filling-> Axis,AspectRatio->1]

ListLinePlot[{36,16,9,64,1,340,36,0,49,81},PlotTheme->"Web", Filling-> Axis,AspectRatio->2]

Potrebno je da izaberete onaj AspectRatio koji ima najviše smisla za to što grafikom želite da prikažete

Ukupna veličina grafika: ImageSize

Opcija ImageSize specifikuje ukupnu veličinu grafika. Nacrtati malecku “tiny” kružnicu:

Graphics[Circle[],ImageSize->Tiny]

Nacrtati kružnice specifikovanih veličina slike od 5 do 50 piksela:

Table[Graphics[Circle[],ImageSize->n],{n,5,50,5}]

Manipulate[Graphics[Circle[],ImageSize->n],{n,5,100}]

Opcije za Style tekstova

Naravno, nisu samo grafici ti koji imaju opcije. Puno drugih funkcija ih takođe ima. Na primer, Style ima puno opcija. Jedna od njih je Chalkboard font (školska tabla):

Style["text in a different font",20,FontFamily->"Chalkboard"]

Style["text in a different font",20,Blue,FontFamily->"Chalkboard"]

Style["text in a different font",20,Blue,Italic,FontFamily->"Chalkboard"]

?Style

Opcije za WordCloud

Vrlo je uobičajemo da opcijama regulišemo kako će nešto biti prikazano u outputu. Na primer u WordCloud možemo da napravimo WordCloud sa slučajnom orijentacijom reči:

WordCloud[DeleteStopwords[WikipediaData["computer"]],WordOrientation->"Random"]

Opcije za Grid

Grid takođe ima puno opcija (odlično ih je proučiti). Frame opcija kontroliše da li kako da se crta ram. Napravite tablicu množenja i stavite ram oko svakog elementa tablice:

Grid[Table[i*j,{i,10},{j,10}],Frame->All]

Kao i Graphics, Grid ima Background opcija:

Grid[Table[i*j,{i,10},{j,10}],Frame->All,Background->LightBlue]

Dva korisna Manipulate

Manipulate[Range[10]//chartstyle,{{chartstyle,ListPlot,"Type of chart"},{ListPlot,ListLinePlot,BarChart,PieChart,NumberLinePlot}}]

Manipulate[Plot[t Sin[(t^2)],{t,0,3π},PlotTheme-> theme],{{theme,"Business","Chart Theme"},{"Business","Detailed","Marketing","Monochrome","Scientific","Minimal","Web","Classic"}}]

23. Više o brojevima (More about numbers)

Tipovi brojeva u WL

U WL postoji više tipova brojeva. Neki od njih (kao što su celi, racionalni i numerički brojevi) imaju beskonačnu preciznost, dok takozvani realni brojevi uvek imaju konačnu preciznost. Funkcija N je jedna od najvažnijih funkcija u WL. Tip broja možemo saznati iz njegove glave odnosno pomoću Head:

Table[Head[k],{k,{2, 2.3, 2+3 I, 2/3,π}}]

Primetimo da je 2 ceo broj, 2.3 je realni broj, 2+3 I je kompleksni broj, 2/3 je racionalni broj dok je π takozvani numerička veličina (ima glavu Symbol a ne Real kao 2.3).

Racionalni, realni i celi brojeva. Funkcija N

Kada radimo sa celim brojevima ili razlomcima, Wolfram Language nam uvek daje egzaktan rezultat (zbog beskonačne preciznosti). Na primer:

1/2+1/3

Često želite da imate numeričku aproksimaciju umesto tačnog rezultata. U tom slučaju koristite funkciju N (od numerical):

N[1/2+1/3]

Pretpostavimo da želimo taj izraz sa 16 značajnih cifara. To se dobija tako što stavimo 16 posle racionalnog broja koji želimo da aproksimiramo

N[1/2+1/3,16]

Ukoliko se negde u izrazu pojavlju numerički broj, celo izračunavanje je automatski numeričko. Na primer:

2.+2/3

Dovoljno je staviti u jednu komponentu decimalnu tačku. Obratite pažnju na razliku između prethodnog i ovog izraza:

2+2/3

Celi brojevi imaju beskonačnu preciznost, realni brojevi ne

Wolfram Language može da radi sa brojevima proizvoljne veličine koji staju u vašu komp memoriju.

Evo broja 2 na 10000 stepen:

2^10000

A evo njegove aproksimacije

N[2^10000]

Ovde je aproksimacija u naučnoj oznaci. Ako želite da unesete broj u naučnoj oznaci koristite *^ .

2.7*^6

RealDigits i FromDigits

RealDigits je analog IntegerDigits i daje cifre realnog broja. Sastoji se iz složene liste. Prva lista su sve cifre. Drugi element složene liste je broj koji definiše koliko ima cifara pre decimalne tačke. Primetimo da broj 14.52 nije u WL samo sa dve decimale. Naime:

RealDigits[14.52]

Prva lista označava sve cifre. Vidimo da broj ima ukupno 16 cifara (dve pre i ostale posle decimalne tačke odnosno zareza).

Obrnuta operacije je da se od liste cifara napravi broj. FromDigits daje racionalan broj:

FromDigits[{{1,4,5,2,0,0,0,0,0,0,0,0,0,0,0,0},2}]

Ovaj broj ne zavisi o toga koliko nula stavimo na kraju.

FromDigits[{{1,4,5,2,0,0,0},2}]

Numeričke veličine (brojevi tipa π i e)

Postoje brojevi tipa π (pi) ili e (osnova prirodnog logaritma) i oni su deo Wolfram Language. Oni nisu celi brojevi, ali nisu ni realni brojevi (u smislu WL) zato što realni brojevi imaju konačnu preciznost a π (ili e) je zadat sa beskonačnom preciznošću.

N[Pi]

N[Pi,300]

Naći prvih trista cifara decimalnog zapisa broja π posle decimalne tačke.

Exp[1]

N[E]

N[E,300]

Naći 300 cifara broja π posle decimalne tačke

Pođimo prvo od izraza

N[Pi,300]

RealDigits[N[Pi,300]]

Ako izdvojimo samo prvi element složene liste dobijamo, a onda odbacimo prvi broj pošto je pre decimale dobijamo

First[RealDigits[N[Pi,300]]]

Drop[First[RealDigits[N[Pi,300]]],1]

Koliko smo dobili cifara posle decimale?

Koliko imamo cifara

Length[Drop[First[RealDigits[N[Pi,300]]],1]]

Dakle, 300 nije dovoljno (to je 300 značajnih cifara a ne 300 cifara posle decimale). Evo pravog odgovora

Drop[First[RealDigits[N[Pi,301]]],1]

Ovo možemo i grafički da predstavimo

ListLinePlot[Drop[First[RealDigits[N[Pi,301]]],1],PlotRange-> All]

Generisanje slučajnih realnih brojeva

Puno funkcija u WL radi sa celim brojevima. Ima takođe mnogo i onih koji rade sa realnim brojevima (aproksimativnim brojevima sa decimalnom tačkom). Na primer, generišimo slučajni realni broj u rasponu od 0 do 10:

RandomReal[10]

RandomReal[10,{5,5}]

Generišite 5 realnih slučajnih brojeva:

Table[RandomReal[10],5]

RandomReal[10,5]

Evo i 5 realnih slučajnih brojeva od 20 to 30, kao i 5 slučajnih celih brojeva:

RandomReal[{20,30},5]

RandomInteger[{20,30},5]

Odbacivanje vrlo malih brojeva: Chop

Još jedna korisna funkcija dozvoljava da odbacimo vrlo male brojeve i izjednačimo ih sa nulom. To radi Chop.

x+2.7*^-16

Chop[x+2.7*^-16]

Određivanje prostih brojeva: Prime

Wolfram Language ima veliki broj ugrađenih matematičkih funkcija (neke ćemo kasnije detaljno proučavati).  Naći stoti prost broj:

Prime[100]

Naći milioniti prost broj:

Prime[1000000]

Nacrtajte prvih 100 prostih brojeva:

ListPlot[Table[Prime[n],{n,100}],PlotTheme->"Detailed"]

Neke važne numeričke funkcije u primenama

Tri funkcije koje su veoma korisne u svakojakim primenama jesu Sqrt (kvadratni koren), Log10 (logaritam baze 10) i Log (prirodni logaritam). Evo kako rade:

{Sqrt[16],(Sqrt[25]),Sqrt[200]}

Prirodni logaritam radi ovako:

{Log[100],Log[1],Log[E]}

Primene logaritama

Logaritmi su veoma korisni kada radimo sa brojevima koji se veoma različiti po veličini. Pretpostavimo da hoćemo da predstavimo mase planeta. Sa ListPlot ne možemo da to lako da uradimo jer je Jupiter mnogo teži od ostalih:

ListPlot[EntityClass["Planet",All]["Mass"]]

QuantityMagnitude[EntityClass["Planet",All]["Mass"]]

A sada možemo da vidimo kako izgleda log plot:

ListPlot[Log[QuantityMagnitude[EntityClass["Planet",All]["Mass"]]]]

Apsolutna vrednost (Abs) i zaokruženje (Round)

Ima puno drugih funkcija koje rade sa brojevima i pojavljuju se često u programiranju. Jedna je Abs, koja izračunava apsolutnu vrednost broja. Abs kod realnih, celih i racionalnih brojeva samo odbaci znak minus ukoliko postoji:

{Abs[3.4],Abs[-4.8]}

Sledeća funkcija je Round, koja zaokružuje do najbližeg celog broja.

{Round[3.2],Round[3.4],Round[3.6],Round[3.9]}

Ceiling, Floor i Mod

Imamo i druge dve slične funkcije: Floor i Ceiling. Floor zaokružuje do prvog donjeg celog broja, a Ceiling do prvog gornjeg celog broja.

{Ceiling[3.2],Ceiling[3.9]}

{Floor[3.2],Floor[3.9]}

Još jedna vrlo korisna funkcija je modul, ili Mod. Pretpostavimo da želimo da brojimo minute u jednom satu. Kada stignemo do 60 onda počinjeno od 0. To se radi sa Mod. Mod je ostatak u deljenju dva broja.

{Mod[50,60],Mod[55,60],Mod[60,60],Mod[65,60],Mod[70,60]}

Q and A

Navedite neke druge često korišćene funkcije u WL?
U srednjoj školi smo učili Sin, Cos, ArcTan, Exp, Factorial, Fibonacci (videćemo kasnije). U statistici koristimo, na pirmer, Erf, NormalDistribution, ChiSquareDistribution. Postoje stotine predefinisanih funkcija koje rade sa podacima (brojevima).

Šta je preciznost broja?
To je ukupan broj decimalnih mesta prilikom predstavljanja broja. N[100/3, 5] daje 33.333, što je preciznost od 5 cifara. Broj 100/3 je egzaktan; N[100/3, 5] aproksimira sa preciznošću 5.

Šta znači   na kraju svake linije kod dugačkog broja?
To znači da se broj nastavlja u narednoj liniji, kao crtica u tekstu.

Mogu li da radim sa brojevima koji nisu u bazi 10?
Da. U bazi 16 možemo da unesemo broj kao 16^^ffa5. Naći cifre broj 655 u bazi 16 koristeći IntegerDigits[655, 16].

Može li WL da radi sa kompleksnim brojevima?
Naravno. Evo primera kompleksnog broja

3+4 I

Nastavak Q and A

Primetimo da je I kvadratni koren od -1. Naime:

(I^2)

Zašto N[1.5/7, 100] ne daje rezultat sa 100 decimala?
Zato što je1.5 približan broj koji, po definiciji, ima samo 16 decimala, pa iz toga ne možemo da izvučemo veću preciznost.

Wolfram Language ima proizvoljnu preciznost izračunavanja, to jest može da se zadrži koliko hoćemo decimalnih mesta. 

Kada radite sa realnim brojevima (sa decimalnim tačkama) WL automatski uzima u obzir preciznost prilikom izračunavanja, tako da ne morate da se prinete o greškama aproksimacije. 

Ako napišete 1.5 automatski ćemo imati “machine precision” (tipično 16 decimalnih mesta). Ako hoćemo preciznost od 100 decimalnih mesta koristimo 1.5 `100.

PrimeQ testira da li je broj prost ili nije. FactorInteger nalazi proste činioce celih brojeva.

RandomReal može da generiše brojeve koji nisu samo uniformno raspodeljeni. Na primer, RandomReal[NormalDistribution[ ]] daje normalno raspodeljene slučajne brojeve. O ovim stvarima mnogo više kada budemo radili verovatnoću u WL.

24. Još formi vizualizacije (More forms of visualization)

PlotStyle definiše boju i stil plota

Ima puno drugih načina da predstavimo podatke. Do sada smo koristili najviše ListPlot i ListLinePlot. Ukoliko želite da predstavite više skupova podataka istovremeno, dovoljno je da svaku imate kao listu. Na primer:

ListLinePlot[{{1,3,4,3,1,2},{2,2,4,5,7,6,8}}]

Primetimo da je prvi grafik plave boje, a drugi grafik oker boje po defoltu. Ali to možemo i da kontrolišemo putem PlotStyle. PlotStyle opcija dozvoljava da izaberemo stil kojom će svaka od dve linije biti predstavljena:

ListLinePlot[{{1,3,4,3,1,2},{2,2,4,5,7,6,8}},PlotStyle->{Red,{Blue,Dotted}}]

Prvi grafik je sada crvena neprekidna linija, dok je drugu grafik predstavljen sa plavim tačkicama.

ListLinePlot[{{1,3,4,3,1,2},{2,2,4,5,7,6,8}},PlotStyle->{{Red,Dashed},{Blue,Thick}}]

Opcije Mesh i GridLines

Mesh opcija dozvoljava da predstavimo i same tačke da plotu:

ListLinePlot[{{1,3,4,3,1,2},{2,2,4,5,7,6,8}},PlotStyle->{Brown,{Blue,Dotted}},Mesh->All,MeshStyle->Red]

Nekada je vrlo korisno dodati opciju GridLines tako da vidimo preciznije gde se koja tačka na grafiku nalazi

ListLinePlot[{{1,3,4,3,1,2},{2,2,4,5,7,6,8}},PlotStyle->{Brown,{Blue,Dotted}},Mesh->All,MeshStyle->Red,GridLines->Automatic]

Opcije PlotLegends i PlotLabel

Opcija PlotLegends pravi oznake (legende) za grafove.

ListLinePlot[{{1,3,4,3,1,2},{2,2,4,5,7,6,8}},PlotLegends->{"Prvi graf","Drugi graf"}]

ListLinePlot[{{1,3,4,3,1,2},{2,2,4,5,7,6,8}},PlotLegends->{"Prvi graf","Drugi graf"},PlotStyle->{{Red,Dashed},{Blue,Thick}}]

Opcija PlotLabel definiše naslov za grafike. Ona se može formatirati pomoću Style. Evo primer

ListLinePlot[{{1,3,4,3,1,2},{2,2,4,5,7,6,8}},PlotLegends->{"Prvi graf","Drugi graf"},PlotStyle->{{Red,Dashed},{Blue,Thick}},PlotLabel->Style["Grafik dva skupa podataka", Brown, Bold, 18]]

ContourPlot

ContourPlots povezuje geometrijsko mesto tačaka iste visine.

ContourPlot[x^2+2 y^2,{x,-3,3},{y,-3,3}]

Ta funkcija je veoma korisna ukoliko želimo da predstavimo grafičko rešenje sistema jednačina u dve dimenzije

ContourPlot[{x^2+2 y^2==5,x+2y==3},{x,-3,3},{y,-3,3},PlotLegends->{"Prva jedn.","Druga jedn."}]

Sa ove slike vidimo da ovaj sistem jednačina ima dva moguća rešenja.

ParametricPlot

U slučaju portfolio analize ili kod rešavanja sistema diferencijalnih jednačina veoma je koristan ParametricPlot (kada i x i y zavise od nekog zajedničkog parametra).

ParametricPlot[{3 Cos[t],2 Sin[2t]},{t,0,2 Pi}]

Na istom grafiku možemo imati i više parametarskih plotova. Razlikujemo pomoću PlotLegedens opcije “Expressions”:

ParametricPlot[{{2Cos[t],2Sin[t]},{2Cos[t],Sin[t]},{Cos[t],2Sin[t]},{Cos[t],Sin[t]}},{t,0,2Pi},PlotLegends->"Expressions"]

Histogram

Histogram meri relativnu frekvenciju različitih podataka. Napravite Histrogram za 10000 RandomReal brojeva od 0 do 100.

Histogram[RandomReal[100,10000]]

Napravite listu histograma za uzorak dužine 10000 sume slučajnih brojeva dužine 1 do 5, ukoliko je svaki slučajni broj generisan od 0 do 100. Kako povećavamo broj sabiraka u sumi slučajnih brojeva, dobijamo raspodelu sve sličniju normalnoj (to je posledica centralne granične teoreme).

Table[Histogram[Table[Total[RandomReal[100,n]],10000],20],{n,5}]

Plot3D, ContourPlot3D, ParametricPlot3D

Konstruisanje 3D plotova funkcije dve promenljive je slično kao Plot funkcije za funkcije jedne promenljive:

Plot3D[x^2+2 y^2,{x,-3,3},{y,-3,3}]

Na sličan način možemo praviti kontur i parametarski plot u 3D. Evo primera

ContourPlot3D[x^3+y^2-z^2==0,{x,-2,2},{y,-2,2},{z,-2,2}]

ParametricPlot3D[{Cos[u],Sin[u]+Cos[v],Sin[v]},{u,0,2π},{v,-π,π}]

ParametricPlot3D[{Sin[u],Cos[u],u/10},{u,0,20}]

Q and A

Kakve sve vizualizacije postoje?
Mnogo. ListStepPlot, ListStreamPlot, BubbleChart, BarChart3D, SmoothHistogram, BoxWhiskerChart, AngularGauge, VerticalGauge i stotine drugih.

Kako da kombinujem plotove koje sam posebno generisao?
Koristite Show ako imaju iste ose. Koristite GraphicsGrid da ih predpostavite jedan pored ili ispod drugog.

Kako da specifikujem binove kod Histograma?
Histogram[list, n]  koristi n binoma. Histogram[list, {xmin, xmax, dx}] koristi binove od xmin to xmax u koracima dx.

U čemu je razlika između BarChart i Histogram?
BarChart direktno predstavlja podatke (bez izmene) a histogram izračunava frekvence sa kojima se podaci pojavljuju.  u BarChart visina svakog pravougaonilka odgovara pojedinačnom podatku. U Histogram, visina svakom pravougaonika odgovara relativnom udelu određene grupe podataka u ukupnoj grupi podataka. 

Kako da znam kolika je visina kod ContourPlot?
Koristi ContourLabels->All.