9  Žemo lygio ir kitos aukšto lygio grafinės funkcijos

Kaip jau žinote, bazinio R grafines funkcijas galima suskirstyti į aukšto ir žemo lygio funkcijas. Daugelį dažnai naudojamų grafikų galima nubraižyti naudojant funkciją plot(), tačiau kai kuriuos grafikus ir diagramas patogiau braižyti taikant tam skirtas specializuotas funkcijas.

9.1 Aukšto lygio grafinės funkcijos

9.1.1 Funkcija curve()

Funkcija curve() naudojama vieno kintamojo funkcijoms \(y = f(x)\) braižyti.

Argumentas Reikšmė
expr funkcijos \(f(x)\) pavadinimas
from funkcijos braižymo intervalo pradžia
to funkcijos braižymo intervalo pabaiga
n taškų skaičius intervale [from, to]
add FALSE, nurodo, ar grafiką uždėti ant jau sudaryto grafiko
xname funkcijos \(f(x)\) argumento vardas

Ši funkcija beveik analogiška funkcijos plot() metodui plot.function. Pavyzdžiui, nubrėšime funkcijos \(y = \sin x\) grafiką uždarame intervale.

Kodas
curve(sin, -pi, pi)

Jeigu norime atvaizduoti funkciją sudarytą iš standartinės R funkcijos ar kelių tokių funkcijų, galime tokią funkciją iš karto užrašyti expr parametre.

Kodas
curve(2*sin(3*x), -pi, pi)

Kodas
curve(1/sin(x) + exp(x), -pi, pi)

Funkciją curve() galima naudoti kaip žemo lygio funkciją, t.y. uždėti jos grafiką ant jau esamo, prieš tai sukurtu grafiko. Pvz., nubraižysime funkcijos \(y = \sin (kx) / k\) grafiką, kai argumentas \(k\) kinta nuo 1 iki 4.

Kodas
fun.si <- function(x, k) y <- sin(k*x)/k

Ši funkcija yra dviejų kintamųjų funkcija, todėl turime vieną kintamąjį fiksuoti tam, kad curve() galėtų šią funkciją atvaizduoti.

Kodas
curve(fun.si(x, k = 1), -pi, pi)

Grafikus su kitomis \(k\) reikšmėmis uždėsime „ant viršaus“.

Kodas
curve(fun.si(x, k = 2), -pi, pi, add = TRUE, col = "purple")
curve(fun.si(x, k = 3), -pi, pi, add = TRUE, col = "purple3")
curve(fun.si(x, k = 4), -pi, pi, add = TRUE, col = "purple4")

Argumentas xname nurodo, koks simbolis braižomoje funkcijoje bus laikomas nepriklausomu kintamuoju (abscisių ašies vardu). Pagal nutylėjimą tai yra \(x\), tačiau jei funkcijoje naudojamas kitas simbolis, jį būtina aiškiai nurodyti naudojant xname. Tai leidžia funkcijai teisingai suprasti, kokį kintamąjį keisti braižant kreivę. Pavyzdžiui, jei braižome funkciją \(f(t) = 2sin(t) + cos(t/2)\), tai reikia naudoti parametrą xname = "t".

Kodas
curve(2*sin(t) + cos(t/2), -pi, pi)  # klaidingas naudojimas
#> Error in curve(2 * sin(t) + cos(t/2), -pi, pi): 'expr' turi būti funkcija, kreipinys arba reiškinys, kuriame yra 'x'

curve(2*sin(t) + cos(t/2), -pi, pi, xname = "t") # teisingas naudojimas

Užduotis
  1. Naudojant funkciją curve(), nubraižykite funkcijos \(y = \ln x\) grafiką intervale \((0, 1]\). Grafiko \(Oy\) ašies ribas nustatykite \([-5, 5]\).

  2. Ant vieno grafiko nubraižykite funkcijų \(y = \sin x\) ir \(y = \cos x\) atitinkamai raudonos ir mėlynos spalvos grafikus.

9.1.2 Funkcija barplot()

Funkcija barplot() skirta stulpelinėms diagramoms. Dažniausiai naudojami parametrai išvardyti lentelėje.

Argumentas Reikšmė
height stulpelių aukščių vektorius arba matrica
width stulpelių pločiai
space tarpas tarp stulpelių
horiz ar stulpeliai braižomi horizontaliai (FALSE - vertikaliai)
beside ar grupės stulpeliai braižomi greta
add ar piešti ant jau esančio grafiko

Paprasčiausiu atveju nurodžius sveikųjų skaičių vektorių bus atvaizduojama stulpelinė diagrama, kur kiekvieno stulpelio aukštis atitiks vektoriaus elemento reikšmę.

Kodas
h <- c(3, -2, 5, -3, 1)
barplot(h)                     # aukščiai = vektoriaus elementai

Kodas
barplot(h, horiz = TRUE)       # horizontalus variantas

Stulpelio pločiai nustatomi keičiant parametro width reikšmę. Jeigu width įgyja daugiau nei vieną reikšmę, t.y. perduodamas vektorius su daugiau nei vienu elementu, tai stulpelių pločiai bus perduodamo vektoriaus elementų reikšmės.

Kodas
barplot(h, width = 1:2)

Stulpeliai vienas nuo kito atskiriami tarpu, kurio plotis proporcingas stulpelio pločiui. Pagal nutylėjimą proporcingumo koeficientas lygu \(0,2\).

Kodas
barplot(h, space = 0)

Kodas
barplot(h, space = 1)

Aišku, galima keisti ir standartinius grafinius parametrus, tokius kaip ašių ribas, stulpelių spalvą, pagrindinę diagramos antraštę ir t.t.

Kodas
barplot(h, horiz = T, ylim = c(0, 6), col = "red", main = "Stulpelinė diagrama")

Dažnai funkcija barplot() naudojama įvairioms dažnių lentelėms atvaizduoti. Kaip pavyzdį panaudosime laivo Titanic įvairių kategorijų keleivių skaičiaus lentelę Titanic.

Pirmiausia peržiūrėsime kategorijas ir jų reikšmes.

Kodas
Titanic
#> , , Age = Child, Survived = No
#> 
#>       Sex
#> Class  Male Female
#>   1st     0      0
#>   2nd     0      0
#>   3rd    35     17
#>   Crew    0      0
#> 
#> , , Age = Adult, Survived = No
#> 
#>       Sex
#> Class  Male Female
#>   1st   118      4
#>   2nd   154     13
#>   3rd   387     89
#>   Crew  670      3
#> 
#> , , Age = Child, Survived = Yes
#> 
#>       Sex
#> Class  Male Female
#>   1st     5      1
#>   2nd    11     13
#>   3rd    13     14
#>   Crew    0      0
#> 
#> , , Age = Adult, Survived = Yes
#> 
#>       Sex
#> Class  Male Female
#>   1st    57    140
#>   2nd    14     80
#>   3rd    75     76
#>   Crew  192     20
dimnames(Titanic)
#> $Class
#> [1] "1st"  "2nd"  "3rd"  "Crew"
#> 
#> $Sex
#> [1] "Male"   "Female"
#> 
#> $Age
#> [1] "Child" "Adult"
#> 
#> $Survived
#> [1] "No"  "Yes"

Ši lentelė yra keturių kintamųjų kryžminė dažnių lentelė. Sumuodami tokią lentelę pagal vieną kurį nors kintamąjį, gauname to kintamojo reikšmių dažnių lentelę. Pvz., sudarysime skirtinga klase keliavusių keleivių skaičiaus lentelę ir nubraižysime ją atitinkančia stulpelinę diagramą.

Kodas
d <- margin.table(Titanic, 1)
d
#> Class
#>  1st  2nd  3rd Crew 
#>  325  285  706  885

barplot(d)

Taip pat pavyzdžiui, sudarysime keleivio klasės ir lyties dažnių lentelę ir ją atvaizduosime diagramos pavidalu.

Kodas
d <- margin.table(Titanic, c(2, 1))
d
#>         Class
#> Sex      1st 2nd 3rd Crew
#>   Male   180 179 510  862
#>   Female 145 106 196   23

barplot(d)

Jeigu norime, kad atskiroje kategorijoje kito kintamojo dažnius vaizduotume ne vienu stulpeliu, o išskaidytus stulpeliais, naudojame parametrą beside = TRUE.

Kodas
barplot(d, beside = TRUE)

Funkcija barplot ne tik nubraižo stulpelinę diagramą, bet taip pat grąžina stulpelių vidurio taškus, kai nurodome parametrą plot = FALSE arba barplot() rezultatą priskiriame kintamajam.

Kodas
barplot(d, plot = FALSE)
#> [1] 0.7 1.9 3.1 4.3

barstat <- barplot(d)

Kodas
barstat
#> [1] 0.7 1.9 3.1 4.3

Funkcija barplot() turi ir daugiau papildomų parametrų, kurių naudojimą galite pabandyti išsiaiškinti savarankiškai.

Argumentas Reikšmė
col stulpelių spalvos
border stulpelių rėmelio spalva (NA – be rėmelio)
names.arg stulpelių etikečių vektorius
axisnames rodyti ar slėpti ašių žymes
axes rodyti ar slėpti pačias ašis
Užduotis
  1. Iš vektoriaus n <- c(1, 3, 2, 5, 4) sukurkite stulpelinę diagramą, kurioje visų stulpelių spalvos būtų skirtingos.

  2. Tai pačiai stulpelinei diagramai suteikite stulpelių vardus.

  3. Nubraižykite vektoriaus n stulpelinę diagramą, kurioje kiekvieno stulpelio plotas būtų lygus vienetui. Nustatykite ašių santykį lygų 1.

  4. Naudodami duomenų lentelę HairEyeColor, sudarykite kryžminę akių ir plaukų spalvos dažnių lentelę. Parametrui legend priskirkite reikšmę TRUE. Kokia akių spalva rečiausia tarp blondinų?

9.1.3 Funkcija boxplot()

Funkcija boxplot() naudojama vieno arba kelių kiekybinių kintamųjų stačiakampėms (angl. boxplot, box and whisker plot) diagramoms.

Tai dažnai aprašomojoje statistikoje naudojamas grafinis būdas nurodyti kiekybinio kintamojo reikšmių padėtį, sklaidą, asimetriją naudojant kvartilius. JAV statistikas John Tuckey pirmasis pavaizdavo tokio tipo grafiką 1970 m.

Argumentas Reikšmė
x skaitinio kintamojo reikšmių vektorius
data duomenų lentelės pavadinimas
subset loginė sąlyga, kuri išskiria dalį stebinių
at x reikšmės, kuriose bus dėžutės
horizontal ar dėžutės braižomos horizontaliai
add ar dėžutės uždedamos ant jau esančio grafiko

Pavyzdžiui, taip atrodo vieno kiekybinio kintamojo s stačiakampė diagrama.

Kodas
s <- c(0.6, 3.4, 6.1, 0.7, 5.2, 1.4, 2.3, 3.4, 2.5, 9.4, 2.7, 4.1, 2.9, 0.1, 7.5)
k <- c("T", "N", "N", "T", "T", "T", "N", "T", "T", "N", "T", "N", "T", "T", "N")

boxplot(s)

Tokio tipo grafikas susideda iš dviejų dalių: stačiakampės dėžutės ir vadinamųjų „ūsų“. Dėžutės plotis yra lygus skirtumui tarp kiekybinio kintamojo trečio ir pirmo kvartilio, taip pat dar vadinamu tarpkvartiliniu pločiu (angl. interquartile range, IQR). Dėžutės viduje esanti linija žymi kiekybinio kintamojo medianą.

Tuo tarpu ūsai yra brėžiami tam tikru atstumu nuo dėžutės. Pagrindinis atvaizdavimo principas – ūsai turi pasibaigti ties egzistuojančia kiekybinio kintamojo reikšme. Pavyzdžiui, ūsai gali būti brėžiami ties minimaliomis ir maksimaliomis reikšmėmis. Tačiau dažniau ūsų ilgis apibrėžiamas nuo pirmo ir trečio kvartilio nutolusiu atstumu, lygiu \(k \cdot IQR\). Čia \(k\) yra laisvai pasirenkamas parametras, kuris reguliuoja ūsų ilgį. Pagal nutylėjimą \(k = 1.5\), o funkcijoje boxplot() jam atitinkantis parametras yra range.

Kadangi ūsai visada turi baigtis ties duomenyse egzistuojančia reikšme, jų ilgis diagramoje gali atrodyti nevienodas, net jei atstumas nuo kvartilių abejose pusėse yra vienodas. Visi kiti stebiniai, kurie patenka už ūsų ribų, laikomi išskirtimis (angl. outliers) ir vaizduojami atskirai: taškais, mažais apskritimais, žvaigždutėmis ar kitais simboliais.

Jei kiekybinio kintamojo s reikšmės yra iš skirtingų grupių, galima nubraižyti stačiakampes diagramas kiekvienoje grupėje atskirai.

Kodas
boxplot(s ~ k)

Jeigu stačiakampei diagramai reikalingi kintamieji yra data.frame tipo duomenų lentelėje, funkcijai boxplot() galima nurodyti jos vardą ir kintamuosius užrašyti per formulę.

Kodas
boxplot(Temp ~ Month, data = airquality)

Nurodyti duomenų lentelę yra patogu, nes tada boxplot() funkcijai galima nusakyti duomenų poaibį, iš kurio turi būti braižomas grafikas.

Kodas
boxplot(Temp ~ Month, data = airquality, subset = Month < 8)

Funkcija boxplot() ne tik nubraižo stačiakampę diagramą, bet ir gali sukurti jai nubraižyti reikalingą duomenų rinkinį - boxplot objektą (sąrašą). Jame surašytos grupės, ir jų vardai, reikšmių ir išsiskiriančių elementų kiekvienoje grupėje skaičius, dėžutei nubraižyti reikalingos statistikos: mediana, kvartiliai ir ūsų galai.

Kodas
boxstat <- boxplot(Temp ~ Month, data = airquality)

Kodas

boxstat$stats     # visų grupių dėžučių statistikos: galai, kvartiliai, mediana
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]   56   67 80.0 72.0   63
#> [2,]   60   76 81.5 79.0   71
#> [3,]   66   78 84.0 82.0   76
#> [4,]   69   83 86.0 88.5   81
#> [5,]   81   93 92.0 97.0   93
boxstat$n         # reikšmių grupėse skaičius
#> [1] 31 30 31 31 30
boxstat$conf      # medianos pasikliautinasis intervalas
#>          [,1]     [,2]     [,3]     [,4]     [,5]
#> [1,] 63.44601 75.98073 82.72301 79.30412 73.11533
#> [2,] 68.55399 80.01927 85.27699 84.69588 78.88467
boxstat$out       # išsiskiriančių stebinių reikšmės
#> [1] 65 73 74
boxstat$group     # išsiskiriančių stebinių grupės numeriai
#> [1] 2 3 3
boxstat$names     # grupių vardai
#> [1] "5" "6" "7" "8" "9"
Užduotis
  1. Naudodami duomenų lentelę iris, nubraižykite Sepal.Length boxplot diagramą grupėse pagal Species. Kurioje grupėje mediana didžiausia?

  2. Užrašykite komandą, kuri, naudojant objektą boxstat, automatiškai nustatytų, kuriose grupėse yra išskirčių.

9.1.4 Funkcija hist()

Funkcija hist() skirta kiekybinio kintamojo dažnių histogramos sudarymui ir jos braižymui.

Argumentas Reikšmė
x kintamojo reikšmių vektorius
breaks intervalų ribos: vektorius arba intervalų skaičius
freq TRUE – braižyti dažnių histogramą, FALSE – tankio histograma
right TRUE – intervalai \((a,b]\), FALSE\([a,b)\)
labels TRUE – rodyti dažnius stulpelių viršuje
plot TRUE – brėžti, FALSE – tik sukurti objektą
add TRUE – brėžti ant esamo grafiko

Panaudosime Nilo vandens lygio stebėjimo duomenis pavyzdžiams iliustruoti.

Kodas
x <- as.numeric(Nile)

hist(s)

Be papildomų nustatymų histogramos stulpelių skaičius parenkamas automatiškai. Naudojant parametrą breaks, kintamojo reikšmių sritį galima padalinti į kelis intervalus, pagal kuriuos ir sudaroma histograma. Pats paprasčiausias būdas – nurodyti intervalų padalijimo taškų vektorių. Reikia priminti, kad histogramos stulpelių bus vienu mažiau nei taškų skaičius.

Kodas
hist(x, breaks = c(400, 600, 800, 1000, 1200, 1400))

Intervalų sudarymo komandą galima visiškai automatizuoti. Paprastai histograma braižoma intervale nuo minimalios iki maksimalios kintamojo reikšmės. Tada jas galima apskaičiuoti naudojant funkcijas min() ir max(). Intervalų skaičių nurodome per funkcijos seq() parametrą length.out. Pastaba: intervalai yra \((a, b]\) formos, ir formaliai minimalią reikšmę turintis imties elementas į pirmąjį intervalą turėtų nepatekti, tačiau hist() parametras include.lowest nurodo, kad reikia įtraukti.

Kodas
hist(x, breaks = seq(min(x), max(x), length = 6))

Kintamojo reikšmes padalinti į intervalus galima ir naudojant funkciją pretty(). Ši funkcija padalinimo taškus parenka taip, kad visi intervalai būtų “gražūs”.

Kodas
hist(x, breaks = pretty(x))

Analogiškai kaip ir kitos aukšto lygio funkcijos, funkcija hist() ne tik nubraižo histogramą, bet ir gali grąžinti histogramos nubraižymo duomenų sąrašą. Jei pats grafikas nereikalingas, jo braižymą galima uždrausti naudojant parametrą plot.

Kodas
histat <- hist(x, breaks = pretty(x), plot = FALSE)
histat
#> $breaks
#> [1]  400  600  800 1000 1200 1400
#> 
#> $counts
#> [1]  1 25 44 23  7
#> 
#> $density
#> [1] 0.00005 0.00125 0.00220 0.00115 0.00035
#> 
#> $mids
#> [1]  500  700  900 1100 1300
#> 
#> $xname
#> [1] "x"
#> 
#> $equidist
#> [1] TRUE
#> 
#> attr(,"class")
#> [1] "histogram"

Iš jo galima sužinoti, kokie yra kintamojo dažniai intervaluose, šių intervalų padalinimo taškus, intervalų vidurio taškus ir pan.

Kodas
histat$breaks  # intervalų padalinimo taškai
#> [1]  400  600  800 1000 1200 1400
histat$mids    # intervalų vidurio taškai
#> [1]  500  700  900 1100 1300
histat$counts  # dažniai intervaluose
#> [1]  1 25 44 23  7

Funkcija plot() turi metodą plot.histogram histogramos objektui atvaizduoti.

Kodas
plot(histat)

Užduotis
  1. airquality duomenų rinkinio nubraižykite birželio temperatūros histogramą. Nurodykite ašių pavadinimus ir grafiko pavadinimą.

  2. Sukurkite histogramos stulpelių etiketes – didžiąsias abėcėlės raides, automatiškai priskiriant tiek raidžių, kiek yra stulpelių.

  3. Užrašykite komandą, kuri naudodama histogramos objektą, surastų aukščiausią histogramos stulpelį atitinkančio intervalo vidurį.

  4. Sugalvokite būdą, kaip nubraižyti Nilo vandens lygio histogramą panaudojant dažnius intervaluose iš anksčiau jau sukurto histogramos objekto – histat.

  5. Pateikite būdą, kaip bet kurio vektoriaus x histogramos grafiką gauti nenaudojant funkcijos hist(), o tik naudojant pvz. plot(), barplot() ir intervalų skaičiavimą.

9.2 Žemo lygio grafinės funkcijos

Šioje dalyje visos iki šiol aptartos grafinės funkcijos pagal nutylėjimą naudojamos kaip aukšto lygio funkcijos. Nustačius tose funkcijose parametrą add = TRUE, nurodome, jog funkcija turi būti panaudota kaip žemo lygio grafinė funkcija.

Toliau aptarsime išskirtinai tik žemo lygio funkcijas, kurios naudojamos taškų, linijų ar kitų grafinių elementų jau sukurtiems grafikams papildymui.

9.2.1 Funkcija points()

Taškai su koordinatėmis \((x, y)\) ant jau nubraižyto grafiko uždedami naudojant funkciją points().

Argumentas Reikšmė
x \(x\) reikšmių vektorius
y \(y\) reikšmių vektorius
pch taško simbolis
cex taško simbolio dydis
col taško spalva

Pavyzdžiui, ant sklaidos diagramos pažymime vieną raudoną tašką \((2,2)\).

Kodas
x <- c(2.0, 1.6, 1.2, 1.0, 1.0, 1.3, 1.6, 2.0, 2.3, 2.8, 2.8, 3.0, 2.8, 2.4, 2.1)
y <- c(0.8, 1.1, 1.3, 1.6, 2.2, 2.5, 2.9, 3.1, 3.0, 2.8, 2.4, 1.8, 1.4, 1.0, 0.9)

plot(x, y, asp = 1)
points(2, 2, pch = 19, col = "red")

Ant to pačio grafiko atidėsime vienetinio apskritimo taškus.

Kodas
k <- 1:360
a <- cos(k) + 2
b <- sin(k) + 2

points(a, b, pch = ".")

Kitas pavyzdys - ant kiekvienos iš stačiakampių diagramų uždėsime atitinkamo vidurkio tašką. Panaudosime airquality duomenų lentelę, kad apskaičiuotume vidutinę temperatūrą pagal mėnesius.

Kodas
temp.vid <- with(airquality, tapply(Temp, Month, mean))
temp.vid
#>        5        6        7        8        9 
#> 65.54839 79.10000 83.90323 83.96774 76.90000

boxplot(Temp ~ Month, data = airquality)
points(x = 1:5, y = temp.vid, col = "red", pch = 19, cex = 1.2)

Funkcijai points() taškų koordinates galima nurodyti ir per jų sąryšio formulę. Pvz., ant pagal mėnesius suskirstytos temperatūros boxplot diagramos uždėsime visas atitinkamo mėnesio temperatūrų reikšmes.

Kintamojo Month reikšmės kinta nuo 5 iki 9, o pagal nutylėjimą boxplot() diagramas atiteda ant \(Ox\) ašies ties taškais \(x=1\), \(x=2\) ir t.t., todėl nurodysime naudojant parametrą at ant kokių reikšmių atidėti stačiakampes diagramas.

Kodas
boxplot(Temp ~ Month, data = airquality, at = 5:9)
points(Temp ~ Month, data = airquality, pch = 20, col = 3)

Keičiant points() parametro type reikšmę, galime keisti taškų atvaizdavimo stilių. Pvz., nubraižysime f-jos \(y = \sin x\) grafiką intervale \([-\pi, \pi]\) ir kas \(\pi/8\) išdėstytus taškus sujungsime dviem laiptuotom linijom.

Kodas
curve(sin, -pi, pi)

x <- seq(-pi, pi, pi/8)
y <- sin(x)

points(x, y, pch = 19)
points(x, y, type = "s")
points(x, y, type = "S")

Jei sudėtingoje diagramoje yra kelios pasikartojančios konstrukcijos, jas galima užrašyte kaip funkciją. Keičiant funkcijos parametrus galima keisti grafinės konstrukcijos diagramoje vietą, dydį ir kitas charakteristikas.

Pavyzdžiui, ant esančio grafiko uždėsime vertikalias atkarpas nuo funkcijos kreivės taško iki \(Ox\) ašies.

Kodas
curve(sin, 0, pi, ylab = "sin(x)", las = 1, frame = FALSE)

add.pt <- function(t, col = "red") {
  y <- sin(t)
  points(t, y, type = "h", col = col)   # vertikali atkarpa
  points(t, y, pch = 19, col = col)     # taškas ant kreivės
  points(t, 0, pch = 19, col = col)     # taškas ant ašies
}

# Vieną tašką galima uždėti taip:
add.pt(pi / 6)

Jeigu vienu metu reikia pakartoti grafinę konstrukciją keletą kartu, patogu tai atlikti naudojant for ciklą.

Kodas
kampai <- seq(-pi, pi, by = pi / 4)
for (t in kampai) add.pt(t, col = "blue")

Užduotis
  1. Duotas dažnių vektorius (3, 2, 5, 3, 1). Nubraižykite stulpelinę šių dažnių diagramą. Kiekvieno stulpelio centre (pagal plotį ir pagal aukštį) uždėkite raudoną tašką.

  2. Naudojant funkciją plot(), grafike atidėkite tašką su koordinatėmis \((10, 10)\). Keisdami tik to pateis vieno taško simbolio dydį, gaukite grafiką, kuriame yra keletas koncentriškų apskritimų.

9.2.2 Funkcija lines()

Kai papildomai uždėtus taškus reikia sujungti linijomis, naudojama žemo lygio funkcija lines(). Ji yra analogiška plot(x, y, type = "l"), tik nedaro naujo brėžinio, o papildo esamą grafiką.

Argumentas Reikšmė
x x reikšmių vektorius
y y reikšmių vektorius
lty linijos tipas
lwd linijos storis
col linijos spalva

Pavyzdžiui, ant anksčiau sudarytos Nilo upės vandens lygio histogramos uždėsime kreivę, kuri bus sudaryta iš atskirų taškų sujungtų linijomis.

Kodas
x <- histat$mids
y <- histat$counts

plot(histat, main = "Nilo vandens lygio pasiskirstymas")
lines(x, y, type = "b", pch = 19, col = "red")

Nubraižysime į mėnesius suskirstytos temperatūros sklaidos diagramą ir mėnesių temperatūros vidurkių taškus sujungsime atkarpomis.

Kodas

plot(Temp ~ Month, data = airquality, pch = 20)

temp.vid <- with(airquality, tapply(Temp, Month, mean))
temp.vid
#>        5        6        7        8        9 
#> 65.54839 79.10000 83.90323 83.96774 76.90000

lines(x = 5:9, y = temp.vid, type = "b", pch = 19, col = "red")

Užduotis
  1. Duomenų lentelėje cars yra automobilio greičio ir stabdymo atstumo duomenys. Nubraižykite šių kintamųjų sklaidos diagramą. Kiekvienai skiritingai greičio reikšmei apskaičiuokite atstumo vidurkį. Gautus taškus uždėkite ant grafiko ir sujunkite juos tiesės atkarpomis.

  2. Nubraižykite funkcijos \(y = \sin(x)\) grafiką intervale \([-\pi, \pi]\), naudodami mėlynus taškus su dvigubu linijos storiu. Ant to paties grafiko raudona punktyrine linija nubrėžkite \(y = \cos x\) grafiką naudodami funkciją lines

9.2.3 Funkcija abline()

Tiesės atkarpą galima nubraižyti naudojant bendro pobūdžio funkcijas plot() arba lines() – užtenka tik nurodyti dviejų taškų koordinates. Dėl tos pačios priežasties šis būdas nėra patogus.

Tiesės plokštumoje lygtį \(y = a + bx\) vienareikšmiškai nusako du parametrai: \(a\) ir \(b\). Norint nubraižyti vertikalią ar horizontalią tiesę, užtenka žinoti tik tašką, kuriame ši tiesės kreta \(Ox\) ar \(Oy\) ašį. Tokių tiesių braižymui naudojama funkcija abline().

Argumentas Reikšmė
a tiesės parametras \(a\)
b tiesės parametras \(b\)
h taškas, kuriame \(Oy\) ašį kerta horizontali tiesė
v taškas, kuriame \(Ox\) ašį kerta vertikali tiesė
col tiesės spalva

Pavyzdžiui, nubrėšime temperatūros kitimo laike grafiką ir uždėsime horizontalią liniją ties 80 laipsnių riba.

Kodas
plot(Temp ~ 1, data = airquality, pch = 20)
abline(h = 80, col = 2)

Tiesę galima uždėti ant bet kokio grafiko. Pvz., nubraižysime stulpelinę diagramą ir ant jos uždėsime horizontalią liniją.

Kodas
d <- margin.table(Titanic, 1)
barplot(d)
abline(h = mean(d), col = "blue3", lty = 2)

Norint nubraižyti pasvirąją tiesę, funkcijai abline() nurodome tiesės parametrų a ir b reikšmes. Pvz., taip uždėsime funkcijos \(f(x) = x + 1/x\) vertikaliąją ir pasvirąją asimptotes.

Kodas
fx <- function(x) x + 1/x
curve(fx, -5, 5, col = "red", main = "Funkcijos y = x + 1/x asimptotės")
abline(a = 0, b = 1, v = 0, lty = 5)

Parametrams v ir h galima nurodyti iš karto kelias reikšmes. Tokiu būdu galima nubraižyti iš karto daug horizontalių ar vertikalių linijų.

Kodas
plot(Temp ~ Month, data = airquality, type = "n")
abline(v = 5:9, h = 60:90, col = "gray")
points(Temp ~ Month, data = airquality, pch = 19)

Užduotis
  1. Nubraižykite kintamojo Nile laiko eilutės grafiką ir uždėkite vidutinį vandens lygį žyminčią raudonos spalvos liniją.

  2. Nubraižykite temperatūros iš duomenų lentelės airquality kitimo laike taškų sklaidos diagramą. Tada vertikaliomis tiesėmis atskirkite kiekvieno mėnesio stebinius.

9.2.4 Funkcija text()

Funkcija text() leidžia ant jau esančio grafiko uždėti papildomą teksto etiketę bet kurioje grafiko vietoje, nusakytoje koordinatėmis \((x, y)\).

Argumentas Reikšmė
x, y teksto koordinatės (skaičiai arba vektoriai)
labels tekstas arba tekstų vektorius
pos padėtis aplink tašką: 1 - apačia, 2 - kairė, 3 - viršus, 4 - dešinė
adj horizontalus/vertikalus lygiavimas (0 - kairė/apačia, 0.5 - centras, 1 - dešinė/viršus)
cex šrifto dydžio mastelis
col teksto spalva
font šriftas: 1 - normalus, 2 - paryškintas, 3 - kursyvas, ir t.t

Tegul kintamasis x yra planetos pusiaujo skersmuo kilometrais, o y – vidutinis tankis gramais į kubinį centrimetrą.

Kodas
x <- c(5.427, 5.24, 5.5153, 3.934)
y <- c(4879.4, 12103.7, 12756.274, 6804.9)
t <- c("Merkurijus", "Venera", "Žemė", "Marsas")

plot(x, y, xlim = c(3, 6), ylim = c(4000, 14000), pch = 19)

Pats paprasčiausias būdas kaip taškus grafike identifikuoti, tai priskirti jiems eilės numerį. Jei funkcijai text() nurodome vien tik taškų koordinates, pagal nutylėjimą ant taškų užrašomas jų numeris.

Kodas
plot(x, y, xlim = c(3, 6), ylim = c(4000, 14000), pch = 19, ann = FALSE)
text(x, y)

Pakeisti uždedami teksto poziciją galime su parametrui pos.

Kodas
plot(x, y, xlim = c(3, 6), ylim = c(4000, 14000), pch = 19, ann = FALSE)
text(x, y, pos = 2)

Dažniausiai taškų numeriai patys savaime nieko nereiškia ir negalima pasakyti pagal tai, kuo skiriasi stebiniai vienas nuo kito. Tokiais atvejais taškams galima priskirti kokį nors kitą požymį. Šiuo atveju naudosime naują kintamąjį – planetos pavadinimų vektorių t.

Kodas
plot(x, y, xlim = c(3, 6), ylim = c(4000, 14000), pch = 19, ann = FALSE)
text(x, y, pos = 2, labels = t)

Toje pačioje pozicijoje galima uždėti kelis skirtingus tekstus, tik aišku kitas uždedamas tekstas turi būti pastumtas į šoną, kad nepersidengtų. Tam naudojamas parametras offset.

Kodas
text(x, y, pos = 2, offset = -1)

Kitais grafinių elementų parametrais galima keisti teksto dydį, spalvą, šrifto tipą ir pan. Jei tekstą reikia pasukti tam tikru kampu, naudojamas parametras srt.

Kodas
plot(x, y, xlim = c(3, 6), ylim = c(4000, 14000), pch = 19, ann = FALSE)
text(x, y, pos = 1, srt = 45)

PASTABA! Įterpti čia locator() funkciją

9.2.5 Funkcija mtext()

Grafikas paprastai turi pagrindinę ir ašių antraštes. Teksto užrašymui grafiko paraštėse naudojama funkcija mtext().

Argumentas Reikšmė
text tesktas arba išraiška
side taško pusė, kurioje atidedamas tekstas (1, 2, 3 arba 4)
line paraštės eilutės numeris, kurioje užrašomas tekstas
at koordinatė, ties kuria paraštėje atidedamas tekstas
adj skaičius (0 arba 1), nurodo, pagal kurią pusę lygiuoti tekstą
cex teksto dydis
col teksto spalva
font šriftas: 1 - normalus, 2 - paryškintas, 3 - kursyvas, ir t.t

Dar kartą nubraižysime planetų išsidėstymo grafiką, kuriame taškas proporcingas planetos dydžiui. Grafiko paraštėse užrašysime papildomą informaciją: dešinėje nurodytas duomenų šaltinis, apačioje dešinėje užrašoma grafiko sudarymo data.

Kodas
plot(x, y, xlim = c(3, 6), ylim = c(3800, 14000), ann = F, fra = F, cex = y/2000)

text(x, y, labels = t, pos = 2, offset = 2)
text(x, y, labels = x, pos = 1, offset = 1.25, cex = 0.7)

informacija <- "Duomenys apie planetas paimti iš Wikipedijos"

mtext(text = informacija, side = 4, at = 4000, adj = 0.0, cex = 0.8, col = 8)
mtext("2025-07-20", side = 1, line = 3, adj = 1, font = 11, cex = 0.8, col = 8)

Naudinga

Papildomi užrašai prie taškų — gana savotiškas būdas plokštumoje atvaizduoti daugiamačius duomenis. Pavyzdžiui, paimsime keturių šalių 2011-2013 m. nedarbo ir infliacijos lygio duomenis. čia tokie kintamieji: šalis, metai, nedarbas ir infliacijos lygis.

Kodas
t <- textConnection("
Šalis    Metai  N     I
Lietuva  2011   15.3  4.1
Latvija  2011   16.2  4.4
Estija   2011   12.5  5.0
Švedija  2011   7.8   3.0
Lietuva  2012   13.2  3.1
Latvija  2012   15.0  2.3
Estija   2012   10.2  3.9
Švedija  2012   8.0   0.9
Lietuva  2013   11.5  1.5
Latvija  2013   11.6  0.4
Estija   2013   8.9   3.3
Švedija  2013   8.1   0.2")

d <- read.table(file = t, header = TRUE)

Pradžioje nubraižysime paprastą infliacijos ir nedarbo lygio sklaidos diagramą.

Kodas
plot(d$N, d$I, xlim = c(6, 17), ylim = c(0, 6), ann = FALSE)
title(xlab = "Nedarbo lygis, %", ylab = "Infliacija, %")

Kadangi taškai diagramoje niekaip neatskiriami, be papildomų paaiškinimų tokia diagrama nieko neparodo. Todėl prie kiekvieno taško prirašysime, kuriai šaliai ir kuriems metams jis priklauso.

Kodas
text(d$N, d$I, labels = d$Šalis, pos = 3)
text(d$N, d$I, labels = d$Metai, pos = 1, cex = 0.5, col = d$Metai - 2010)

points(d$N, d$I, col = d$Metai - 2010, pch = 19)

Tą patį grafiką galima perbraižyti dar kitaip. Sujungsime linijomis tos pačios šalies skirtingų metų taškus. Taip gausime jų judėjimo laike trajektoriją. čia sklaidos grafiką nubraižysime naudojant kintamųjų priklausomybės formulę. Toks užrašymo būdas yra patogesnis, kai iš duomenų lentelės reikia išskirti atskirų šalių stebinius, tada galima pasinaudoti parametru subset.

Kodas
plot(I ~ N, data = d, xlim = c(6, 17), ann = FALSE)
title(xlab = "Nedarbo lygis, %", ylab = "Infliacija, %")

text(I ~ N, data = d, labels = d$Metai, pos = 2, cex = .8, col = d$Metai - 2010)
points(I ~ N, data = d, col = d$Metai - 2010, pch = 19)

lines(I ~ N, data = d, subset = Šalis == "Lietuva", type = "b", lty = 3)
lines(I ~ N, data = d, subset = Šalis == "Latvija", type = "b", lty = 3)
lines(I ~ N, data = d, subset = Šalis == "Estija",  type = "b", lty = 3)
lines(I ~ N, data = d, subset = Šalis == "Švedija", type = "b", lty = 3)

text(I ~ N, data = d, subset = Metai == 2012, 
    labels = d$Šalis, pos = 4, offset = 1, font = 2)

Užduotis
  1. Nubraižykite parabolės \(y = x^2 + 2x - 15\) grafiką. Grafike šalia taškų, kuriuose parabolė kerta \(Ox\) ašį, uždėkite tekstą su šaknų \(x_1\) ir \(x_2\) reikšmėmis. Čia indeksams 1 ir 2 užrašyti naudokite funkciją expression().

  2. Nubraižykite laiko eilutės Nile grafiką. Ties didžiausia ir mažiausia laiko eilutės reikšme uždėkite tekstus su atitinkamo stebinio numeriu ir eilutės reikšme.

  3. Nubraižykite duomenų lentelės airquality kintamojo Temp reikšmių histogramą. F-jos hist() parametrui labels priskyrus reikšmę TRUE, dažnių reikšmes galima užrašyti ant stulpelių viršaus. Sugalvokite, kaip, naudojant funkciją text(), tuos pačius dažnius būtų galima užrašyti stulpelio viduryje.

  4. Naudojant planetų skersmens ir tankio duomenis, sudarykite grafiką, kuriame vietoje planetas atitinkančių taškų būtų pavaizduotas planetos pavadinimas.

  5. Naudojant infliacijos ir nedarbo lygio duomenų lentelę d, nubraižykite 2013 metų infliacijos ir nedarbo lygio sklaidos diagramą. Greta taškų užrašykite šalies pavadinimą. Apatinėje grafiko paraštėje užrašykite infliacijos lygio vidurkį, kuris turi būti apskaičiuojamas automatiškai.

9.2.6 Funkcija grid()

Koordinačių tinklelis ant jau nubraižyto grafiko uždedamas naudojant f-ją grid().

Argumentas Reikšmė
nx tinklelio langelių skaičius ant \(Ox\) ašies
ny tinklelio langelių skaičius ant \(Oy\) ašies
col tinklelio linijų spalva
lty tinklelio linijų tipas
lwd tinklelio linijų storis

Pagal nutylėjimą parametrų nx ir ny reikšmės yra NULL, todėl tinklelio linijos sutampa su ašių padalijimo taškais.

Kodas
curve(sin, -pi, pi)
grid()

Kodas

curve(sin, -pi, pi)
grid(nx = 2, ny = 2)

Jeigu parametrui nx arba ny priskiriama NA reikšmė, tinklelio linijos atitinkama kyrptimi nebraižomos.

Kodas
curve(sin, -pi, pi)
grid(nx = NA, ny = NULL)

Funkcijos grid() galimybės gan ribotos, todėl tinklelio braižymui galima naudoti funkciją abline(). Pvz., nubraižysime sinusoidės grafiką, kuriame \(Ox\) ašies sudalinimo taškai kas \(\pi/2\), o tinklelio linijos dvigubai tankesnės – kas \(\pi/4\).

Kodas
curve(sin, -pi, pi, xaxt = "n")

axis(1, at = seq(-pi, pi, pi/2), labels = expression(-pi, -pi/2, 0, pi/2, pi))

abline(v = seq(-pi, pi, pi/4), col = "lightgray", lty = "dotted")
abline(h = seq(-1., 1., 0.25), col = "lightgray", lty = "dotted")

9.3 Grafiko ašių formavimas

Aukšto lygio grafinės funkcijos (pvz. plot(), curve()) ašis formuoja automatiškai, tačiau kartais jas reikia perbraižyti: pakeisti padalas, etiketes ar net nupiešti papildomą ašį. Tam skirta žemo lygio funkcija axis().

Argumentas Reikšmė
side ašies pozicija: 1 - apačioje, 2 - kairėje, 3 -viršuje, 4 - dešinėje
at padalinimo taškų vektorius
labels loginis arba taškų padalinimo vektorius
tick rodyti (TRUE) / slėpti (FALSE) pačius „brūkšnelius”
line vertikalios paraštės eilutės numeris
pos koordinatė, kurioje kertama kita ašis (pvz. pos = 0)
lty, lwd, col linijos tipas, storis, spalva

Pradinę grafiko ašį galima uždrausti braižyti su xaxt = "n" ar yaxt = "n" (arba abi ašis: axes = FALSE), o vėliau susikurti savąją su axis().

Kodas
curve(sin, -pi, pi, axes = FALSE)

Standartines ašis galima atstatyti tiesiog nurodžius ašies poziciją.

Kodas
axis(1)
axis(2)

Ašies padalinimo taškai nurodomi su parametru at.

Kodas
curve(sin, -pi, pi, frame = FALSE, xaxt = "n")
axis(1, at = seq(-pi, pi, by = pi/2))

Vietoj tikrųjų padalinimo taškų reikšmių (realiųjų skaičių), galima nurodyti taškų žymes per \(\pi\) simbolį, priskiriant labels parametrui reikšmę, gautą taikant funkciją expression().

Kodas
curve(sin, -pi, pi, frame = FALSE, xaxt = "n")

Ox.taskai <- seq(-pi, pi, by = pi/2)
Ox.pav <- expression(-pi, -pi/2, 0, pi/2, pi)

axis(1, at = Ox.taskai, labels = Ox.pav)

Toje pačioje pozicijoje galima turėti kelias ašis. Kiekviena ašis gali turėti savo padalinimo taškus ir jų pavadinimus.

Kodas
curve(sin, -pi, pi, frame = FALSE, xaxt = "n")

Ox.taskai <- seq(-pi, -pi/4, by = pi/4)
Ox.pav <- expression(-pi, -3*pi/4, -pi/2, -pi/4)

axis(1, at = Ox.taskai, labels = Ox.pav)
axis(1, at = seq(0, 3, by = 0.5), labels = c(0, NA, 1, NA, 2, NA, 3))

Dar vienas pavyzdys, kaip toje pačioje pozicijoje atidedamos 2 skirtingos ašys. Viena iš jų padalina ašį į intervalus, o kita – tų intervalų viduryje uždeda jų pavadinimus. Todėl pirmoje ašyje nerašomi sudalinimo taškai, o antroje nėra ašies linijos.

Kodas
curve(sin, -pi, pi, axes = FALSE, ann = FALSE)

Ox.ta1 <- seq(-pi, pi, pi/2)
Ox.ta2 <- seq(-3*pi/4, 3*pi/4, pi/2)

axis(1, at = Ox.ta1, labels = FALSE)
axis(1, at = Ox.ta2, labels = LETTERS[1:4], tick = FALSE)

abline(v = Ox.ta1, lty = 2, col = "gray")

Paprastai ašys braižomos už funkcijos grafiko ar kitokios diagramos ribų, t.y. paraštėse. Paraštės eilutės, kurioje atidedama ašis, numerį nurodome naudojant parametrą line. Pagal nutylėjimą ašis braižoma nulinėje eilutėje.

Kodas
curve(sin, -pi, pi, frame = FALSE, xaxt = "n")
axis(1, line = 0)
axis(1, line = 2)

Ašies poziciją grafike galima nurodyti užrašant kitos ašies kirtimo koordinatę. Tam naudojamas parametras pos.

Kodas
curve(sin, -pi, pi, frame = FALSE, xaxt = "n")
axis(1, pos = -0.5)
axis(1, pos =  0.5)

Žymes ties ašių padalinimo taškais galima stumti į kairę arba į dešinę, naudojant parametrą hadj. Pagal nutylėjimą parametro reikšmė lygi 0.5, reiškianti, kad žymės centruojamos ties padalinimo taškais. Didinant šią reikšmę, žymės stumiamos kairėn.

Jei žymes reikia pakelti arba nuleisti žemiau ties padalinimo taškais, naudojamas parametras padj, kurio reikšmė pagal nutylėjima lygi 0. Didinant reikšmę, žymė stumiama žemyn.

Svarbus skirtumas naudojant šiuos du parametrus - horizontalus postūmis atliekamas visoms žymėms, tuo tarpu vertikalus postūmis kiekvienai žymei gali būti skirtingas. Todėl parametrui hadj reikia nurodyti tik vieną skaičių, o padj - postumių reikšmių vektorių.

Pavyzdžiui, pastumsime tik pirmosios žymės reikšmę į viršų tam, kad ji nepersidengtų su pačia funkcijos kreive.

Kodas
curve(sin, -pi, pi, frame = FALSE, xaxt = "n")
axis(1, pos = 0, padj = c(-4, rep(0, 6)))

Užduotis
  1. Nubraižykite funkcijos \(y = sin(x)\) grafiką intervale \([-\pi, \pi]\). Uždėkite dvi \(Ox\) ašis: apačioje sugraduota kas \(\pi/2\), o viršuje kas vienetą.

  2. Nubraižykite lentelės airquality kintamojo Temp kitimo laike grafiką, kuris turėtų dvi \(Oy\) ašis. Vienoje iš jų temperatûra matuojama Farenheito skalėje, kitoje – pagal Celsijų.

  3. Nubraižykite lentelės airquality kintamojo Temp kitimo laike grafiką. Ašies \(Ox\) sudalinimo taškai turi sutapti su vieno mėnesio pradžia ir kito pabaiga. Ties sudalinimo taškais ant grafiko nubraižykite vertikalias pilkas linijas, o tarpuose tarp padalinimo taškų užrašykite atitinkamo mėnesio pavadinimą.

9.4 Ašies padalijimo taškų radimas

Nubraižyto grafiko ašių padaliniomo taškus galima gauti naudojant f-ją axTicks(). Funkcijos rezultatas yra padalinimo taškų koordinačių vektorius.

Argumentas Reikšmė
side ašies pozicija: 1 - apačia, 2 - kairė, 3 - viršus, 4 - dešinė
axp ašies ribų ir intervalų skačiaus vektorius c(min, max, k)
usr grafikų ribų vektorus c(xmin, xmax, ymin, ymax)
log jei TRUE, ašis nurodomo logaritminėje skalėje

Pavyzdžiui, nubraižysime funkcijos \(y = \sin x\) grafiką be ašių ir nustatysime, kam būtų lygios ašies \(Ox\) sudalijimo taškų koordinatės, jei ašis būtų braižoma.

Kodas
curve(sin, -pi, pi, axes = FALSE)

Kodas
axTicks(1)
#> [1] -3 -2 -1  0  1  2  3

Ašies padalinimo taškų vektorius priklauso nuo paties grafiko. Norint, kad rezultatas nepriklausytų nuo grafiko, reikia nurodyti visų parametrų reikšmes. Pvz., rasime intervalo nuo 5 iki 20, padalinimo į 6 lygias dalis, taškų koordinates.

Kodas
axTicks(side = 1, axp = c(5, 20, 6), log = FALSE)
#> [1]  5.0  7.5 10.0 12.5 15.0 17.5 20.0

Negriežtam intervalo padalinimui lygiomis dalimis naudojama funkcija axisTicks(). Funkcijos rezultatas yra intervalo sudalinimo lygiomis dalimis taškų vektorius. Pradinio intervalio galai ir padalinimo taškų skaičius gali būti automatiškai pakoreguojamas tam, kad būtų išlaikomas tam tikra prasme „gražus“ padalinimas.

Argumentas Reikšmė
usr grafiko vienos ašies ribų vektorius c(min, max)
log jei TRUE, ašis nurodomo logaritminėje skalėje
axp ašies ribų ir intervalų skačiaus vektorius c(min, max, k)
nint pageidaujamas intervalų dalių skaičius

Pavyzdžiui, ligiomis dalimis padalinsime intervalą nuo 5 iki 20. Intervalų skaičius parenkamas automatiškai, jeigu kitaip nenurodoma.

Kodas
axisTicks(usr = c(5, 20), log = FALSE)
#> [1]  6  8 10 12 14 16 18 20

Matome, jog funkcijos rezultatas nesikeičia, kai nedaug pakeičiami intervalo galai.

Kodas
axisTicks(usr = c(5.3, 20.5), log = FALSE)
#> [1]  6  8 10 12 14 16 18 20

Nurodžius intervalo dalių skaičių, į pageidavimus atsižvelgiama tik iš dalies.

Kodas
axisTicks(usr = c(5, 20), log = FALSE, nint = 4)
#> [1]  5 10 15 20
axisTicks(usr = c(5, 20), log = FALSE, nint = 5)
#> [1]  6  8 10 12 14 16 18 20
axisTicks(usr = c(5, 20), log = FALSE, nint = 6)
#> [1]  6  8 10 12 14 16 18 20
axisTicks(usr = c(5, 20), log = FALSE, nint = 7)
#> [1]  6  8 10 12 14 16 18 20
Užduotis
  1. Naudodami axTicks() suraskite, kokios būtų \(y = \cos x\) funkcijos \(Ox\) ašies padalos intervale \([-2\pi, 2\pi]\), jeigu grafikas būtų braižomas su numatytosiomis ašimis.

  2. Nubrėžkite Nile laiko eilutės grafiką ir, naudojant funkciją axTicks(), pažymėkite vertikalias ribas kas 20 metų.