Pakett ggplot2
:
qplot()
ehk quick plot, mis on paketi vaste R-i baasgraafika funktsioonile plot()
. Põhjalikumalt ja paindlikumalt võimalik graafikuid kujundada funktsiooniga ggplot()
Kogu ggploti graafik algab alati funktsiooniga ggplot()
, mis loob tühja kihi, kus saab täpsustada mida ja millise graafiku osana kuvada.
Seda, kust andmed võetakse, tuleb täpsustada argumendiga data
.
Andmestiku tunnuste visualiseerimiseks kasutatakse argumenti mapping
ja selle väärtusena funktsiooni aes
(aesthetics). aes
’i argumentidega (ehk sulgude sees) on omakorda võimalik öelda näiteks, et visualiseeri graafiku x-teljel üht tunnust (x =
), y-teljel teist (y =
), värvi abil kolmandat (color =
), täitevärvi abil neljandat (fill =
), kujundi abil viiendat (shape =
), suuruse abil kuuendat (size =
) jne.
Kui tahame nt küsimustikust x-teljel visualiseerida lemmiklooma kategooriaid, siis täpsustame selle argumendiga mapping = aes(x = lemmikloom)
.
Kuna me ei ole veel öelnud, mismoodi me lemmiklooma tahame graafikul kuvada (nt kas tulpdiagrammina või pirukana), siis joonistatakse endiselt tühi palett, mille x-teljele on nüüd märgitud lemmiklooma kategooriad.
Nii data
’t kui ka mapping
’ut on võimalik täpsustada ka hilisemates kihtides, kusjuures argumentide nimed võib ka ära jätta kui järjekord on õige.
2. kiht täpsustab, millist graafikutüüpi mingi tunnuse või tunnuste kuvamiseks kasutada. Seda kihti nimetatakse geom_function
’iks. Levinumad geom´id on
geom_point
,geom_histogram
,geom_boxplot
geom_bar
geom_label
geom_text
# Jätame ära argumentide nimed "data" ja "mapping"
ggplot(kysimustik,
aes(x = lemmikloom)) +
geom_bar()
# Käsku võib lugeda nii:
# kasuta andmestikust 'kysimustik'
# tunnust 'lemmikloom'
# kuvamiseks graafiku x-teljel,
# kusjuures graafiku tüübiks on
# tulpdiagramm.
Nagu öeldud, võib data
’t ja tunnuste mapping
’ut täpsustada ka geom-kihtides. Näiteks ülal oleva graafiku saame ka sellise koodiga:
Selline vormistus on kasulik eriti siis, kui tahame kujutada samal graafikul näiteks erinevate andmestike või sama andmestiku erinevate alamhulkade tunnuseid. Näiteks võime samal graafikul kujutada lisaks eraldi joonega ainult kohvijoojate vastuste sagedusi. Kuna geom_line
on nn kollektiivne geom ehk selle joonistamiseks kasutatakse mitme vaatluse andmeid, siis selleks, et joon oleks ühendatud üle kõikide kategooriate, kasutame aes
-funktsiooni sees argumenti group
. Kui tahta näidata ainult üht vaatluste gruppi, võib group
’i väärtus olla mis tahes konstant, nt 1, 500, “a” vmt.
ggplot() +
geom_bar(data = kysimustik,
aes(x = lemmikloom)) +
geom_line(data = kysimustik[kysimustik$lemmikjook == "Kohv",],
aes(x = lemmikloom, group = 1),
stat = "count", # tuleb lisada, et ggplot teaks, kust tulevad sagedused ("count" ehk "loe kokku")
color = "gold1")
Kui aga tahta grupeerida vaatlusi mingi andmestiku tunnuse järgi, tuleb group
väärtuseks panna seesama andmestiku tunnus ise. Kuvame näiteks nii tee- kui ka kohvijoojate vastused tulpade peal eri värvi joontena.
ggplot() +
geom_bar(data = kysimustik,
aes(x = lemmikloom)) +
geom_line(data = kysimustik,
aes(x = lemmikloom,
group = lemmikjook, # grupeeriv tunnus
color = lemmikjook), # värvime jooned ka grupeeriva tunnuse järgi
stat = "count")
Võrdle:
3. kiht lubab modifitseerida seda, kuidas mingil kujul graafikul esitamiseks valitud tunnus graafikul täpselt välja näeb. Seda kihti nimetatakse ka scale_function
’iks.
scale
’iga saab modifitseerida seda elementi, mille kaudu tunnust graafikul kujutatud on, nt scale_x_...
, scale_y_...
, scale_color_...
, scale_fill_...
, scale_size_...
, scale_shape_...
jne.
scale
-funktsiooni nime viimane element (üleval märgitud praegu punktiiriga) kirjeldab tunnuse modifitseerimise tüüpi, värviskaalat vms. See, mis argumendid mingil konkreetsel scale
-funktsioonil on, sõltub funktsioonist endast. Trüki konsooli nt scale
ja vajuta tabulaatorit, et näha erinevaid variante.
Kasutame scale
-funktsiooni, et nimetada graafikul ümber lemmiklooma tasemed ning kuvada ka tase “Mulle ei meeldi loomad”, mida keegi vastanutest ei valinud.
ggplot(kysimustik,
aes(x = lemmikloom)) +
geom_bar() +
scale_x_discrete(drop = FALSE, # Ära viska välja vastajateta, tühja väärtust "Mulle ei meeldi loomad"
labels = c("Glaucus", # Nimeta joonisel lemmiklooma tasemed ümber
"Kirjak",
"Kutsa",
"Ei meeldi"))
Kujutame nüüd graafikul veel täitevärviga (fill
) seda, kui suur osa mingi looma valinutest olid tee- ja kui suur osa kohvijoojad. scale
-funktsioonis saame näiteks määrata, millist värvipaletti tahaksime tulpade täitevärvi jaoks kasutada.
ggplot(kysimustik,
aes(x = lemmikloom,
fill = lemmikjook)) +
geom_bar(position = "dodge") + # Aseta lemikjoogi kategooriad üksteise kõrvale eraldi tulpadesse
scale_x_discrete(drop = FALSE, # Ära viska välja vastajateta, tühja väärtust "Mulle ei meeldi loomad"
labels = c("Glaucus", # Nimeta joonisel lemmiklooma tasemed ümber
"Kirjak",
"Kutsa",
"Ei meeldi")) +
scale_fill_brewer(type = "qual", # Värvi tulbad breweri värvipaketist kvalitatiivseid tunnuseid eristava värviga
palette = 2) # ja kasuta paletti nr 2.
4. kihil võime täpsustada telgede ja graafikute pealkirjad, alapealkirjad jmt funktsiooniga labs()
.
ggplot(kysimustik,
aes(x = lemmikloom,
fill = lemmikjook)) +
geom_bar(position = "dodge") +
scale_x_discrete(drop = FALSE,
labels = c("Glaucus",
"Kirjak",
"Kutsa",
"Ei meeldi")) +
scale_fill_brewer(type = "qual",
palette = 2) +
labs(x = "Lemmikloom",
y = "Sagedus",
fill = "Lemmikjook",
title = "Lemmikjook vastavalt lemmikloomale",
subtitle = "aastatel 2018-2020",
caption = "Andmed: kursuse FLFL.00.009 osalejate vastused küsimustikule")
ggploti graafikuid saab ka salvestada eraldi objektidesse, et neid taaskasutada. Salvestame meie praeguse joonise objekti nimega p.
p <- ggplot(kysimustik,
aes(x = lemmikloom,
fill = lemmikjook)) +
geom_bar(position = "dodge") +
scale_x_discrete(drop = FALSE,
labels = c("Glaucus",
"Kirjak",
"Kutsa",
"Ei meeldi")) +
scale_fill_brewer(type = "qual",
palette = 2) +
labs(x = "Lemmikloom",
y = "Sagedus",
fill = "Lemmikjook",
title = "Lemmikjook vastavalt lemmikloomale",
subtitle = "aastatel 2018-2020",
caption = "Andmed: kursuse FLFL.00.009 osalejate vastused küsimustikule")
5. kihil võime täpsustada otseselt andmetega mitteseotud elementide väljanägemist graafikul funktsiooniga theme()
. Selliste elementide hulka kuuluvad nt teksti suurus, värv, font, paksus, paiknemine, graafiku tausta värv, graafiku piirjoonte olemasolu, paksus, värv, ruudustiku kuvamine jne. On terve hulk n-ö sisse-ehitatud teemasid, nt theme_bw()
, theme_grey()
, theme_light()
, theme_dark()
, theme_minimal()
, theme_classic()
jne.
Teemat on aga võimalik ka ise kohandada, täpsustades kohandatavaid elemente funktsiooni theme()
sees. Kohandatavaid elemente on palju:
axis.___
telgede elemendid
legend.___
legendi elemendid
panel.___
joonise üldala elemendid
plot.___
joonise enda elemendid
jne.
Iga elemendi väljanägemist saab täpsustada ühega neljast element
-funktsioonist:
element_blank()
- eemaldab mis tahes elemendi täielikult
element_line()
- täpsustab joonte väljanägemist
element_rect()
- täpsustab piirjoonte ja tausta väljanägemist
element_text()
- täpsustab teksti väljanägemist
Näiteks võib teha sellise teemakihi:
theme(axis.text = element_text(size = 12, # telgede teksti suuruseks 12
color = "grey50"), # ja värviks hallikas
legend.background = element_rect(fill = "transparent"), # legendi taust läbipaistvaks
legend.position = c(0.1, 0.8), # legend joonise sisse (suhteline asend x- ja y-teljel)
panel.background = element_rect(fill = "grey90"), # joonise üldala taustaks hallikas
panel.grid = element_blank(), # kustuta taustaruudustik
plot.subtitle = element_text(hjust = 0.5), # joonise alapealkiri joondada keskele
plot.title = element_text(hjust = 0.5, # joonise pealkiri joondada keskele
face = "bold")) # ja kuvada paksus kirjas
Kasutame nüüd objekti p salvestatud graafikut ning lisame sellele loodud teema.
p + theme(axis.text = element_text(size = 12,
color = "grey50"),
legend.background = element_rect(fill = "transparent"),
legend.position = c(0.1, 0.8),
panel.background = element_rect(fill = "grey90"),
panel.grid = element_blank(),
plot.subtitle = element_text(hjust = 0.5),
plot.title = element_text(hjust = 0.5,
face = "bold"))
ggploti üks suuri eeliseid on paneelide funktsioon, mille abil on võimalik jagada andmestik ühe või mitme tunnuse järgi osadeks ning kuvada kõikide alamandmestike graafikuid korraga ühel joonisel.
Jagame näiteks tehtud graafiku paneelideks vastajate kursusel osalemise aasta järgi. Kasutame selleks funktsiooni facet_wrap()
. Tunnus, mille alusel paneelid tehakse, lisatakse argumendina funktsiooni sisse.
ggplot(kysimustik,
aes(x = lemmikloom,
fill = lemmikjook)) +
geom_bar(position = "fill") + # Kasutame absoluutsageduste asemel proportsioone
scale_x_discrete(drop = FALSE,
labels = c("Glc",
"Krk",
"Kr",
"EiM")) +
scale_fill_brewer(type = "qual",
palette = 2) +
labs(x = "Lemmikloom",
y = "Sagedus",
fill = "Lemmikjook",
title = "Lemmikjook vastavalt lemmikloomale",
subtitle = "aastatel 2018-2020",
caption = "Andmed: kursuse FLFL.00.009 osalejate vastused küsimustikule") +
facet_wrap("aasta") + # Jagame andmestiku aastate järgi paneelideks. NB! Tunnus jutumärkides!
theme(axis.text = element_text(size = 12,
color = "grey50"),
legend.background = element_rect(fill = "transparent"),
panel.background = element_rect(fill = "grey90"),
panel.grid = element_blank(),
plot.subtitle = element_text(hjust = 0.5),
plot.title = element_text(hjust = 0.5,
face = "bold"))
Joonist paneelideks jagav tunnus peab olema funktsioonis kas jutumärkides või kujul ~tunnus
(ilma jutumärkideta). Võib jagada ka mitme tunnuse järgi. Sel juhul on funktsiooni sees kas c("esimenetunnus", "teinetunnus")
või esimenetunnus~teinetunnus
. Alternatiiv funktsioonile facet_wrap()
on facet_grid()
, mis kuvab paneele pisut teistmoodi.
ggplot(kysimustik,
aes(x = synniaasta)) +
geom_histogram(binwidth = 5, # sagedusklassi ulatus 5 ühikut (aastat)
boundary = 0, # aitab antud juhul joondada klasse skaala numbritega
color = "black", # klasside ääred mustad
fill = "transparent") + # klasside sisu läbipaistev
scale_x_continuous(breaks = seq(1965, 2000, 5)) + # x-skaala 1965-st 2000-ni 5-aastaste intervallidena
labs(title = "Sünniaasta histogramm",
x = "Sünniaasta",
y = "Sagedus") +
theme_classic() +
theme(plot.title = element_text(hjust = 0.5), # graafiku pealkiri keskele
axis.text.y = element_text(angle = 90, # y-telje tekst 90-kraadise nurga alla
hjust = 0.5), # y-telje tekst joondada sakkidega
panel.background = element_rect(color = "black")) # joonise alale serv ümber
ggplot(kysimustik,
aes(x = synniaasta)) +
geom_histogram(binwidth = 10,
boundary = 0,
color = "grey50",
fill = c("blue", "purple", "red", "pink")) +
scale_x_continuous(breaks = seq(1960, 2000, 10)) +
labs(title = "Sünniaasta histogramm",
x = "Sünniaasta",
y = "Sagedus") +
theme_classic() +
theme(plot.title = element_text(hjust = 0.5),
panel.background = element_rect(color = "black"))
ggplot(kysimustik,
aes(y = synniaasta)) +
stat_boxplot(geom = "errorbar", # vurrud tuleb joonistada eraldi funktsiooniga
width = 0.5) + # vurru laius 50% kasti laiusest
geom_boxplot(outlier.shape = 1, # muuda erindi sümbolit
outlier.size = 2) + # tee erindi sümbol suuremaks
scale_y_continuous(breaks = seq(1970, 1995, 5)) +
labs(y = "") +
theme_classic() +
theme(axis.text.y = element_text(angle = 90,
hjust = 0.5),
axis.text.x = element_blank(), # ära näita x-telje teksti
axis.ticks.x = element_blank(), # ära näita x-telje sakke
panel.background = element_rect(color = "black")) +
xlim(-1, 1) # lisa karbist vasakule ja paremale natuke tühja ruumi
ggplot(kysimustik,
aes(x = lemmikloom, y = synniaasta)) +
stat_boxplot(geom = "errorbar",
width = 0.5) +
geom_boxplot(fill = c("lightblue", # kastide värvid
"yellow",
"grey"),
outlier.shape = 1,
outlier.size = 2) +
scale_x_discrete(drop = FALSE) + # ära viska välja lemmiklooma klassi, mida keegi ei vastanud
scale_y_continuous(breaks = seq(1970, 1995, 5)) +
theme_classic() +
theme(axis.text.y = element_text(angle = 90,
hjust = 0.5),
panel.background = element_rect(color = "black"))
ggplot(kysimustik,
aes(y = kaua_opid,
x = seq_along(kaua_opid))) +
geom_point(shape = 1,
size = 1.5) +
labs(x = "Index") +
theme_classic() +
theme(panel.background = element_rect(color = "black"),
axis.text.y = element_text(angle = 90,
hjust = 0.5))
ggplot(kysimustik,
aes(x = synniaasta,
y = kaua_opid)) +
geom_point(shape = 15,
color = "grey50",
size = 1.5) +
scale_x_continuous(breaks = seq(1970, 1995, 5)) +
labs(x = "Sünniaasta",
y = "Õpitud aastate arv",
title = "Õpitud aastate seos sünniaastaga") +
theme_classic() +
theme(panel.background = element_rect(color = "black"),
axis.text.y = element_text(angle = 90,
hjust = 0.5),
plot.title = element_text(hjust = 0.5))
ggplot(kysimustik,
aes(x = synniaasta,
y = kaua_opid,
color = kogemused_kvant)) +
geom_point(shape = 15,
size = 1.5) +
scale_x_continuous(breaks = seq(1970, 1995, 5)) +
scale_color_manual(name = "Kogemusi kvantmeetoditega",
values = c("grey50", "orange")) +
labs(x = "Sünniaasta",
y = "Õpitud aastate arv",
title = "Õpitud aastate seos sünniaastaga") +
theme_classic() +
theme(panel.background = element_rect(color = "black"),
axis.text.y = element_text(angle = 90,
hjust = 0.5),
plot.title = element_text(hjust = 0.5),
legend.direction = "horizontal",
legend.position = c(0.4, 1), # legend algab x-telje 40% peal ning lõppeb y-telje 100% peal
legend.justification = c(0,1), # legendi asetus
legend.background = element_rect(color = "black"))
ggplot(kysimustik,
aes(x = kogemused_kvant)) +
geom_bar(fill = "grey70",
color = "black") +
labs(y = "", x = "") +
theme_classic() +
theme(axis.line.x = element_blank(),
axis.text.y = element_text(angle = 90,
hjust = 0.5))
ggplot(kysimustik,
aes(x = kursuse_labimine,
fill = kogemused_kvant)) +
geom_bar(position = "dodge", color = "black") +
scale_x_discrete(drop = FALSE) +
scale_y_continuous(breaks = seq(0, 12, 2)) +
scale_fill_manual(values = c("grey35", "orange"), # määra käsitsi kogemused_kvant kategooriate värvid
name = "Kogemusi kvantmeetoditega") + # nimeta legend ümber
labs(x = "Kursuse läbimise tõenäosus",
y = "Vastanute arv") +
theme_classic() +
theme(axis.text.y = element_text(angle = 90,
hjust = 0.5),
axis.line.y = element_blank(), # kustuta ära y-telje joon
axis.ticks.y = element_blank(), # kustuta ära y-telje sakid
legend.position = c(0.4, 0),
legend.justification = c(0,0),
legend.direction = "horizontal",
legend.background = element_rect(color = "black")) +
coord_flip()
ggplot(kysimustik,
aes(x = kursuse_labimine,
fill = kogemused_kvant)) +
geom_bar(position = "fill",
color = "black") +
scale_x_discrete(drop = FALSE) +
scale_y_continuous(breaks = seq(0, 1, 0.2)) +
scale_fill_manual(values = c("grey35", "orange"),
name = "Kogemusi kvantmeetoditega") +
labs(x = "Kursuse läbimise tõenäosus",
y = "Vastanute proportsioonid") +
theme_classic() +
theme(axis.text.y = element_text(angle = 90,
hjust = 0.5),
axis.line.y = element_blank(),
axis.ticks.y = element_blank(),
legend.position = c(0.4, 0),
legend.justification = c(0,0),
legend.direction = "horizontal",
legend.background = element_rect(color = "black")) +
coord_flip()
ggplot(kysimustik,
aes(x = kursuse_labimine,
fill = kogemused_kvant)) +
geom_bar(position = position_fill(reverse = TRUE),
color = "black") +
scale_x_discrete(drop = FALSE) +
scale_y_continuous(breaks = seq(0, 1, 0.2)) +
scale_fill_manual(values = c("grey35", "orange"),
name = "Kogemusi kvantmeetoditega") +
labs(x = "Kursuse läbimise tõenäosus",
y = "Vastanute proportsioonid") +
theme_classic() +
theme(axis.text.y = element_text(angle = 90,
hjust = 0.5),
axis.line.y = element_blank(),
axis.ticks.y = element_blank(),
legend.position = c(0.4, 0),
legend.justification = c(0,0),
legend.direction = "horizontal",
legend.background = element_rect(color = "black")) +
coord_flip()
Kumbki graafikapakett ei ole olemuslikult parem kui teine ja on suur tõenäosus, et joonist, mida saad teha ggplotis, saad teha ka baasgraafikas. Kummaga täpselt töötada, sõltub isiklikest eelistustest, harjumusest ja veidi ka sellest, milliseid graafikuid ja mille jaoks tüüpiliselt kasutatakse. Baasgraafikapaketiga saab enamasti kiiremini oma andmetest ülevaate, ggplot pakub veidi enam võimalusi nt rakendustes või veebilehtedel jooksvateks joonisteks ning on laialtlevinud andmeteaduses. Publitseerimiseks tuleb mõlema paketiga töötades joonistega pisut vaeva näha. Mõlemal paketil on ka terve hulk laiendusi, mis võimaldavad teha asju, millega pakett ise toime ei tule (nt 3D graafikud ggplotis). Asjad, milles ggplotil on siiski selge eelis, on nt legendid, grupeerimine ja paneelid (facets). Loe ka siit.