R ggplot2 (Icelandic)

Eftirfarandi efni er birt undir Creative Commons (CC) leyfi: Attribution-NonCommercial-ShareAlike CC BY-NC-SA. Því er hverjum sem er leyfilegt að nýta efnið og breyta því (remix, tweak, build upon) svo lengi sem það er ekki gert í gróðaskyni (non-commercial). Einnig er viðkomandi skylt að geta uppruna efnisins og höfundar þess (attribution) og að dreifa efni sem byggir á eftirfarandi efni undir sams konar leyfi (identical terms). Upprunalegur höfundur þessa efnis (Heiða María Sigurðardóttir) er undanþeginn öllum skilyrðum.

Table of Contents

Áður en þú byrjar

Í þessari R-stílabók eða R Markdown Notebook, er ætlunin að kenna fólki að gera gröf með hjálp R-pakkans (R package) ggplot2. Gert er ráð fyrir að fólk sé búið að setja bæði R og RStudio upp á tölvunni sinni (settu fyrst upp R, svo RStudio). R er forritunarmál/forskriftarmál sem hentar sérstaklega vel fyrir tölfræðiúrvinnslu og myndræna framsetningu gagna. Hægt er að nota R-forritunarmálið án RStudio en það er heldur leiðinlegra og meira vesen. RStudio er gagnvirkt þróunarviðmót (IDE) fyrir R.

Enn fremur er gert ráð fyrir að fólk vinni í stílabókinni sjálfri með því að opna skjalið ggplot2_myndir.Rmd í RStudio og keyra kóðabútana (code chunks) beint úr stílabókinni. Ef þið eruð að lesa þetta á vefsíðu ætti að vera hægt að ná í skjalið með því að smella hér. Þó má einnig klippa (cut) út tiltekna kóðabóta og líma (paste) þá inn í R skipanaskrá (script) eða keyra þá beint af stjórnborði (console).

Hægt er að skrifa R-kóða á ýmsan hátt, en mælt er með að fólk tileinki sér að skrifa snyrtilegan og læsilegan kóða, sjá Google R Style Guide.

Þessi stílabók er skrifuð á íslensku með séríslenskum stöfum. Séríslenskir stafir geta þó í sumum tilfellum valdið vandræðum í R, en hægt er að kynna sér það nánar á síðustu glærunni hér. Almennt er gott að forðast séríslenska stafi í kóðabútum og gagnaskrám.

Eftirfarandi er dæmi um kóðabút:



5+2


[1] 7



Kóðabútar geyma skipanir í forritunarmálinu R. Hægt er að gefa R ýmiss konar ólíkar skipanir. Þessi tiltekna skipun leggur saman tvær tölur. Prófaðu að keyra (run) kóðann, og þá fylgir R skipuninni um að leggja saman tölurnar tvær.

Þú getur keyrt kóðabút með því að:

  1. Smella á play takkann efst til hægri við tiltekinn kóðabút
  2. Smella einhvers staðar innan tiltekins kóðabúts, smella á Run takkann efst og velja þar Run current chunk
  3. Smella einhvers staðar innan tiltekins kóðabúts og halda niðri Ctrl+Shift+Enter á lyklaborðinu.

R-pakkar

Segja mætti að R-pakki (R package) sé samansafn af alls konar fyrirfram skrifuðum R-kóða sem hægt er að nota til ákveðinna verkefna. ggplot2 er einn slíkur pakki, en hann er sérstaklega til þess fallinn að sjá um myndræna framsetningu gagna í R. Pakkinn ggplot2 er hluti af svokölluðu tidyverse, sjá nánar á vefsíðunni tidyverse.org og í vefbókinni R for Data Science sem ég mæli heilshugar með. tidyverse er sjálft í raun R-pakki sem inniheldur margra skylda R-pakka með undarleg nöfn á borð við ggplot2, tibble og purrr.

Að ná í R-pakka

Þar sem við viljum e.t.v. geta notað fleiri pakka úr tidyverse en ggplot2 er best að ná í þá alla á einu bretti. Það þarf aðeins að gera það einu sinni, en eftir það er tidyverse pakkinn og allir undirpakkar hans (þar með talið ggplot2) til á tölvunni og ekki þarf að ná í þá aftur.

Hægt er að ná í tidyverse pakkann annað hvort með því að:

  1. Smella á Tools á stikunni, velja Install Packages úr flettilistanum, skrifa tidyverse í Packages textaboxið (þar sem stendur (hafið hakað við Install Dependencies)
  2. Keyra eftirfarandi kóðabút:



install.packages("tidyverse")



Athugaðu að þú ættir aðeins að þurfa að keyra kóðabútinn að ofan einu sinni – nema ef ske kynni að þú sért með gamla útgáfu af tidyverse pakkanum og viljir uppfæra hann.

Að gera R-pakka tiltæka

Ef við viljum nota eitthvað úr ggplot2 pakkanum eða öðrum tidyverse pökkum þurfum við ekki að ná í pakkana aftur – þeir eru þegar til á tölvunni – en við þurfum samt að segja R að við ætlum að nota þá. Ef við viljum nota eitthvað af tidyverse pökkunum er hægt að gera þá tiltæka með því að keyra eftirfarandi kóða (passið gæsalappirnar):



library("tidyverse")



Þegar kóðinn hefur verið keyrður er hægt að nota tidyverse pakkana, þ.m.t. ggplot2. Athugaðu að ef þú endurræsir tölvuna þína eða t.d. lokar RStudio þá þarftu að gera pakka sem þú vilt nota tiltæka á á ný með því að keyra kóða á borð við library(“nafniðápakkanum”).

Að ná í gögn

Ætlunin er að kenna ykkur að búa til myndrit/gröf, en fyrst þurfum við að hafa einhver gögn til þess að byggja á. Gagnaskráin sem við ætlum að vinna með heitir havisindaleg_konnun.xlsx og er Excelskjal. Gagnaskrána má finna hér.

Áður en þið haldið áfram verðið þið að ná í skrána havisindaleg_konnun.xlsx og segja hana í sömu möppu og þessi R-stílabók (þ.e. skráin ggplot2_myndir.Rmd) er vistuð. Það er vel hægt að geyma gagnaskrána annars staðar á tölvunni, en þá þyrfti að breyta kóðanum hér að neðan til samræmis við það. Ég geri hér með ráð fyrir að skráin sé komin í sömu möppu og R-stílabókin.

Hávísindaleg könnun

Skráin inniheldur gögn sem söfnuðust í áfanganum Aðferðafræði (SÁL115G) sem kenndur er við Sálfræðideild Háskóla Íslands. Búið er að eiga aðeins við gögnin til þess að þau henti betur til að kenna á fólki myndræna framsetningu gagna. Hér er tengill á könnunina, en þar safnaði ég alls konar einskis nýtum upplýsingum til að finna í þeim mynstur sem þýða líklega ekki neitt! Könnunin er nafnlaus en hægt er að tengja saman svör við ólíkum spurningum. Þátttaka í könnuninni var valfrjáls og hafði engin áhrif á einkunn í námskeiðinu.

Að skoða gagnaskrána í Excel

Byrjið á því að opna gagnaskrána í Excel og skoða hana betur (önnur forrit, svo sem OpenOffice, ráða einnig við að opna Excelskrár og það er allt í lagi að nota þau). Gagnaskráin inniheldur margar línur og marga dálka. Hver röð inniheldur öll gögn frá einum þátttakanda í könnuninni.

Þátttakendanúmerin eru skráð í fyrsta dálkinn (1, 2, 3, 4…), þannig að gögn fyrsta þátttakandans eru í röð 1, gögn næsta þátttakanda eru í röð 2 o.s.frv.

Dálkar 2-9 tákna svo tiltekna spurningu í könnuninni. Athugið þó að ég sleppti einni spurningu (Hver er sjöundi tölustafurinn í kennitölunni þinni?) til að forðast með öllu að svörin séu rekjanleg.

Dálkur 10 sýnir hvenær viðkomandi þátttakandi sendi inn könnunina samkvæmt sjálfvirkri tímaskráningu, en tímastimplunin er námunduð að heilum klukkutíma (21:47 yrði t.d. 22).

Dálkur 11 sýnir hve mörgum klukkustundum munar á hvenær könnun var send inn samkvæmt sjálfvirkri tímaskráningu og svo hvað þátttakandi sagði sjálfur að klukkan væri; þannig fengi þátttakandi sem ofáætlaði tímann um tvær klukkustundir gildið 2 og þátttakandi sem vanáætlaði tímann um 2 klukkustundir fengi sömuleiðis gildið 2.

Að lokum geymir dálkur 12 upplýsingar um hvort þátttakandi hafi (líklega) skráð tímasetninguna rétt; þessi breyta fær gildið Já ef ekki skeikar nema að hámarki 3 klst á tímastimplun og svari þátttakandans, annars fær hún gildið Nei.

Það þýðir að dálkarnir eru 12 talsins. Þeir eru:

  1. thatttakandi.nr: Númer þátttakanda í könnun
  2. tomatar.eru.avextir: Hversu ósammála eða sammála ertu eftirfarandi fullyrðingu? “Tómatar eru ávextir”
  3. haed.cm: Hver er hæð þín í cm?
  4. veistu.hvad.verdur.thegar.stor: Veistu hvað þú ætlar að verða þegar þú verður stór?
  5. hvad.er.kl: Hvað er klukkan (veldu sem kemst næst)?
  6. eru.sokkar.svartir: Ertu í svörtum sokkum núna?
  7. hvar.situr: Hvar siturðu yfirleitt í kennslustundum?
  8. hve.vondar.godar.olifur: Hversu bragðvondar eða bragðgóðar finnst þér ólífur?
  9. hvernig.nafla: Ertu með innstæðan eða útstæðan nafla?
  10. timastimpill: Hvenær var könnun send inn (sjálfvirk tímaskráning)?
  11. skeikar.um.klst: Um hve margar klst. skeikar svörum?
  12. timi.rett.skradur: Er tíminn rétt skráður?

Hér eftir tala ég um thatttakandi.nr, timastimpil, tomatar.eru.avextir o.s.frv. sem breytur (variables). Breyturnar geta tekið tiltekin mismunandi, þ.e. breytileg, gildi. thatttakandi.nr tekur gildin 1, 2, 3, 4 o.s.frv. timastimpill tekur gildin 1-24, tomatar.eru.avextir tekur gildin 1, 2, 3, 4 eða 5 þar sem 1 táknar “mjög ósammála” og 5 táknar “mjög sammála”. Hægt er að kanna nánar hvaða gildi aðrar breytur geta tekið með því að skoða könnunina sjálfa.

Að lesa inn gagnaskrá

Nú skaltu loka gagnaskránni í Excel og lesa hana í stað þess inn í R. Til þess ætlum við að nota R-pakka sem heitir readxl. Þessi pakki er sérstaklega til þess fallinn að lesa Excelskrár inn í R. Pakkinn er hluti af tidyverse og ætti því að vera tiltækur á tölvunni þinni hafirðu þegar náð í tidyverse pakkann. Aftur á móti þarf samt sem áður að segja R sérstaklega að maður ætli sér að nota readxl pakkann. Hægt er að gera það með því að keyra eftirfarandi kóðabút:



library(readxl)



Núna eru þær aðgerðir (eða föll, functions) sem readxl pakkinn inniheldur tiltæk fyrir þig. Þá geturðu notað eða kallað á aðgerðina read_excel sem er ein af aðalaðgerðunum pakkans. read_excel aðgerðin, eins og nafnið bendir til, er notuð til þess að lesa Excelskrár. Athugið að read_excel gerir (réttilega) ráð fyrir að fyrsta röðin í Excelskránni innihaldi heiti á breytum/dálkum. Rétt eins og með margar aðrar aðgerðir í R er þó hægt að breyta stillingum aðgerðarinnar. Til þess að kalla á aðgerðina setur maður nafn skráarinnar inn í sviga á eftir nafni aðgerðarinnar sbr. read_excel(“nafnáskrá”).

Almennt gildir að sjáirðu eitthvert nafn sem á eftir fylgi svigi, þá er þetta nafn á aðgerð. Aðgerðir sem þið hafið þegar unnið með er t.d. install.packages, sbr. install.packages(“tidyverse”), og library, sbr. library(“tidyverse”), en fyrri aðgerðin nær í tiltekinn R-pakka og sú síðari gerir tiltekinn R-pakka tiltækan. Ef þú vilt fræðast um tiltekna aðgerð, hvernig hún er notuð og hvað hún gerir, þá geturðu keyrt kóða á borið við ?nafnáaðgerð. Ef þú vilt t.d. fræðast um read_excel geturðu keyrt eftirfarandi kóðabút:



?read_excel



Ef þú keyrir kóðabútinn ættirðu að sjá hjálparskrá read_excel aðgerðarinnar, en þar kemur m.a. fram að hún sé til þess að lesa inn xls og xlsx skrár, en það eru tvær tegundir af Excelskrám. Gagnaskráin okkar heitir havisindaleg_konnun.xlsx og er einmitt xlsx skrá. Við lesum hana inn með því að keyra eftirfarandi kóða (takið eftir gæsalöppunum og að skráarendingin .xlsx verður að koma fram, þar sem þetta er xlsx skrá):



gagnasafn <- read_excel("havisindaleg_konnun.xlsx")



Það sem kóðabúturinn gerði var að kalla á read_excel aðgerðina, segja aðgerðinni að vinna með tiltekna skrá, og geyma útkomu aðgerðarinnar í nýrri breytu sem við köllum gagnasafn.

Breyta í þessum skilningi er eins og geymslubox, við getum geymt hvað sem er í boxinu. Í þessu tilfelli geymir boxið – eða breytan – gagnaskrána sem við lásum inn í R. Merkið <- (oddklofi og strik) kallast gildingarvirki (assignment operator). Merkið er eins og píla sem táknar að það á að setja það sem er hægra megin við píluna (hér útkomu aðgerðarinnar) yfir í það sem er vinstra megin (hér breytuna gagnasafn).

Ekki láta það rugla ykkur þótt ég noti orðið breyta bæði yfir “boxið” sem geymir gagnasafnið okkar og svo dálkana í gagnasafninu. Breyta þýðir bara eitthvað sem er breytilegt, og við getum breytt því hvað er í boxinu rétt eins og það er breytilegt hvernig þátttakendur svöruðu tiltekinni spurningu í könnuninni.

Athugið einnig að breytan gagnasafn hefði getað heitið eitthvað allt annað, t.d. konnun eða my.data eða bara lina.langsokkur – við gefum henni einfaldlega það nafn sem okkur hentar (með einstaka undantekningum, t.d. verður breytuheiti að vera allt í einu orði og því má breyta ekki heita gagna safn).

Athugið þó að R er það sem kallast stafrétt (case sensitive) sem þýðir að R gerir greinarmun á há- og lágstöfum; gagnasafn er ekki það sama og Gagnasafn eða GAGNASAFN eða gagna.safn. Skrifaðu því breytuheiti alltaf eins. Það sama gildir um aðgerðir.

Að skoða gagnaskrána í R

Við erum þegar búin að skoða gagnaskrána í Excel en við viljum vera viss um að R hafi örugglega lesið gögnin rétt inn – annars verður allt sem við gerum kolvitlaust! Þú getur gert það á a.m.k. tvennan hátt:

  • Finndu glugga í RStudio forritinu sem heitir Environment. Þar ætti að standa Data og þar undir ættirðu að finna breytuna þína gagnasafn. Ef þú smellir á hana opnast nýr gluggi sem sýnir alla gagnatöfluna þína.
  • Kallaðu á aðgerðina View með því að keyra þennan kóðabút:



View(gagnasafn)



Við köllum á aðgerðina og biðjum hana um að vinna með gagnasafnið okkar sem geymt er í breytunni gagnasafn. Við viljum bara skoða upplýsingarnar en ekki geyma þær í breytu (“geymsluboxi”); þess vegna inniheldur kóðinn hvorki neitt nýtt breytuheiti né <- gildingarvirkjann.

Myndræn framsetning gagna

Nú ætti gagnasafnið að vera tilbúið til notkunar í R. Þá snúum við okkur að myndrænni framsetningu gagnanna.

Aðalaðgerðin í ggplot2 pakkanum heitir einfaldlega ggplot. Aðgerðin er notuð til þess að búa til nýtt graf. Til þess að kalla á aðgerðina skrifum við nafnið á henni og setjum hvaðeina sem við viljum að aðgerðin vinni með eða taki tillit til (gögn, skipanir, stillingar…) inn í sviga á eftir nafninu.

Prófaðu nú að keyra eftirfarandi kóðabút:



ggplot(data = gagnasafn, mapping = aes(x = eru.sokkar.svartir, y = haed.cm))




Þessi kóðabútur gerði ekkert sérlega merkilegt. Við kölluðum á ggplot aðgerðina til þess að búa til nýtt graf og sögðum aðgerðinni að gögnin (data) sem eigi að nota fyrir grafið megi finna í breytunni gagnasafn. Enn fremur létum við vita hvernig tengja ætti gögn við graf (mapping). Nánar tiltekið létum við vita að x-ásinn eigi að byggjast á breytunni eru.sokkar.svartir, þ.e. hvort þátttakendur séu í svörtum sokkum eða ekki, og að y-ásinn eigi að byggjast á breytunni haed.cm, þ.e. hæð fólks í sentimetrum.

Til þess að setja upp þessa tengingu kölluðum við á aðgerðina aes sem stendur fyrir aesthetics sem merkir fagurfræði eða einfaldlega útlit. aes aðgerðin er notuð til að láta breytur í gagnasafninu okkar stjórna útlitslegum eiginleikum grafsins. Algengast er að tengja breytur við ásana tvo, x og y, eins og hér var gert. Aftur á móti er hægt að tengja breytur við aðra útlitslega eiginleika en staðsetningu á x- og y-ás, t.d. láta gildi á tiltekinni breytu ráða stærð tákna á grafinu eða lit þeirra. Þetta má einnig gera með hjálp aes aðgerðarinnar.

Grafið er aftur á móti tómt af því að við erum ekki búin að segja ggplot aðgerðinni nákvæmlega hvernig birta á gögnin í gagnasafn. Hvernig graf ætlum við eiginlega að gera?

Áður en við förum nánar út í hvernig gera má ólíkar tegundir grafa er rétt að benda á ótrúlega þægilegt “svindblað” (cheat sheet) fyrir ggplot2, en þar má t.d. sjá hvaða aðgerðir eða skipanir maður á að nota til að gera tiltekin gröf.

Gröf fyrir eina breytu

Gröf sem sýna dreifingu einnar tiltekinnar breytu eru mikilvæg í upphafi gagnaúrvinnslu. Það er alltaf gott að skoða dreifingu allra breyta til að fá betri tilfinningu fyrir gögnunum og til þess að finna jafnvel villur sem slæðst hafa inn í gagnasafnið. Til þess að skoða dreifingu eru hægt að nota mörg mismunandi gröf sem henta misvel eftir því hvort breytan sem um ræðir er t.d. nafnbreyta (nominal variable), raðbreyta (ordinal variable), jafnbilabreyta (interval variable) eða hlutfallsbreyta (ratio variable).

Hér fyrir neðan skoðum við hæðardreifingu þátttakenda á stöplariti, súluriti, þéttniriti, kassariti og fiðluriti. Berið saman útkomuna.

Stöplarit (histogram)

Fyrsta aðgerðin sem við ætlum að skoða til þess heitir geom_histogram og er notuð til þess að búa til stöplarit (histogram). Þessi aðgerð tekur samfellda (continuous) tölulega breytu, til dæmis hæð fólks í sentimetrum, sem inntak (input). Aðgerðin skiptir gögnunum sem breytan geymir niður í nokkur bil (bins) – t.d. 1-50 cm, 51-100 cm o.s.frv. – og telur svo hversu mörg stök falla innan hvers bils, í þessu tilfelli hversu margir þátttakendur eru á tilteknu hæðarbili.

Búum nú til stöplarit sem sýnir hæðardreifingu þátttakenda. Keyrum eftirfarandi kóða:



ggplot(
  data = gagnasafn, mapping = aes(x = haed.cm)) + 
  geom_histogram() +
  labs(
    x = "Hver er hæð þín í cm?", 
    y = "Fjöldi þátttakenda"
  )




Fyrsta lína kóðans að ofan er kunnugleg: Hún býr til nýtt graf, tengir grafið við gagnasafn og segir að við ætlum að láta hæð fólks í sentimetrum á x-ás. Hér tilgreinum við reyndar ekki hvaða breyta eigi að fara á y-ás. Á bak við tjöldin gerir R ráð fyrir að þar sem y-breytan er ekki skilgreind þá viljum við í raun láta fjöldatölur (count) á y-ás. Við hefðum einnig getað skrifað mapping = aes(x = haed.cm, y = ..count.. og fengið sömu niðurstöðu, en það er óþarfi þar sem R gerir ráð fyrir því að fyrra bragði.

Takið þó eftir plúsmerkinu í enda fyrstu línu en það segir manni að skipunin sé í raun ekki búin heldur ætli maður að bæta einhverju við grafið. Restin af skipuninni er sett í næstu línu; hún gæri raunar verið sett strax á eftir plúsmerkinu í fyrstu línu – en það er bara ljótara og erfiðara að lesa slíkan kóða.

Í annarri línu kóðans er nýju lagi (layer) bætt við grafið með hjálp aðgerðarinnar geom_histogram, en hægt er að gera flókin gröf í ggplot2 með því að byggja þau upp lag fyrir lag, sjá hér. geom_histogram aðgerðin segir R að nú eigi að teikna stöplarit. Sviginn á eftir nafni aðgerðarinnar er tómur af því að við þurfum ekki að gefa henni neinar frekari upplýsingar; við erum þegar búin að tilgreina gagnasafn, hvaða breyta eigi að vera á x-ás og (bak við tjöldin) hvaða breyta eigi að vera á y-ás.

Að lokum endurnefnum við x- og y-ása með hjálp labs aðgerðarinnar (stytting á labels eða merkimiðum). Athugið að ég hef skipt inntaki (input) labs aðgerðarinnar á milli lína. Þetta er einungis gert til þess að gera kóðann læsilegri, en sama niðurstaða hefði í raun fengist með því að skrifa allt í einni línu sbr. labs(x = “Hver er hæð þín í cm?”, y = “Fjöldi þátttakenda”). Almennt mæli ég með að fólk hugi að því að skrifa snyrtilegan og læsilegan kóða.

Súlurit (bar chart)

Súluritið sem fæst með því að keyra eftirfarandi kóða er afar líkt stöplaritinu, en ólíkt stöplaritinu er breytunni ekki skipt niður í hæðarbil heldur fær hvert gildi sína súlu og súlurnar eru auk þess aðskildar.



ggplot(data = gagnasafn, mapping = aes(x = haed.cm)) + 
  geom_bar() +
  labs(
    x = "Hver er hæð þín í cm?", 
    y = "Fjöldi þátttakenda"
  )




Þéttnirit (density plot)

Þéttnirit sýnir hlutfallslega dreifingu á hæð fólks, sem búið er að “rúnna af” (smooth). Athugið að y-ásarnir á stöplaritinu fyrir ofan og þéttniritinu hér fyrir neðan eru ekki sambærilegir (til þess að gera þá sambærilega, sjá leiðbeiningar hér).



ggplot(data = gagnasafn, mapping = aes(x = haed.cm)) + 
  geom_density() +
  labs(
    x = "Hver er hæð þín í cm?", 
    y = "Þéttni (density)"
  ) 




Kassarit (box plot)

Lárétta strikið í miðju kassans á kassariti sýnir miðgildi hæðar. Helmingur fólks er undir þessari hæð og helmingur fólks fyrir ofan hana. 25% fólks er lægra en neðri brún kassans, kassinn sjálfur (hvíti hlutinn) geymir svo helming fólks eða 50% og 25% fólks er hærra en efri brún kassans. Hæð kassans frá neðri að efri brún gefur því ágæta mynd af hæðardreifingu þátttakenda. Óvenjulega há eða lág gildi eru skráð með punktum. Óvenjuleg gildi sem skera sig verulega frá öðrum gildum kallast frávillingar eða útlagar (outliers) og þeir geta haft veruleg og oft slæm áhrif á úrvinnslu gagna. Hægt er að lesa nánar um útlaga og áhrif þeirra hér. Nánari útskýringar á kassariti má svo finna hér. Athugið að á kassaritinu hér fyrir neðan er hæð skráð á y-ás:



ggplot(data = gagnasafn, mapping = aes(x = " ", y = haed.cm)) + 
  geom_boxplot() +
  labs(
    x = "Allir þátttakendur", 
    y = "Hver er hæð þín í cm?"
  )




Ef við viljum að hæð fólks sé á láréttum ás, til samræmis við stöplaritið, súluritið og þéttniritið, getum við kallað á aðgerðina coord_flip, en aðgerðin setur það sem áður var á lóðréttum ás á láréttan ás og öfugt (hægt er að nota aðgerðina í öðrum gröfum einnig). Athugið þó að við skráum x og y í aðgerðunum aes og labs nákvæmlega eins og áður:



ggplot(data = gagnasafn, mapping = aes(x = " ", y = haed.cm)) + 
  geom_boxplot() +
  labs(
    x = "Allir þátttakendur", 
    y = "Hver er hæð þín í cm?"
  ) +
  coord_flip()




Fiðlurit (violin plot)

Fiðlurit mætti kalla nokkurs konar sambland af þéttniriti og kassariti. Hægt er að hugsa sér að búið sé að teikna þéttnirit á hlið og spegla því síðan um miðju grafsins:



ggplot(data = gagnasafn, mapping = aes(x = " ", y = haed.cm)) + 
  geom_violin() +
  labs(
    x = "Allir þátttakendur", 
    y = "Hver er hæð þín í cm?"
  )




Rósarit (rose chart)

Skoðum nú aðeins aðra breytu í gagnasafn sem heitir hvad.er.kl. Hún geymir svör þátttakenda við spurningunni: Hvað er klukkan (veldu sem kemst næst)? Þátttakendur völdu úr flettilista heilar tölur á bilinu 1-24. Byrjum á að skoða dreifingu svaranna í venjulegu súluriti:



ggplot(data = gagnasafn, mapping = aes(x = hvad.er.kl)) + 
  geom_bar() + 
  labs(
    x = "Hvað er klukkan?", 
    y = "Fjöldi þátttakenda"
  )




Á grafinu hér að ofan sjáum við t.d. að flestir þátttakendur sögðust hafa fyllt út könnunina klukkan 11 um morgunn, en enginn sagðist hafa fyllt hana út kl. 3 eða 4 um nótt. Vandamálið við þessa framsetningu gagnanna er samt að klukkan gengur í hringi, en það er ekkert á grafinu hér fyrir ofan sem sýnir manni að kl. 1 sé í raun mjög nálægt kl. 24. Við getum gert þetta betur með því að láta hreinlega súluritið okkar fara í hring. Slíkt rit kallast rósarit (rose chart).

Við gerum það með því að taka það sérstaklega fram að það eigi ekki að nota venjulegt hnitakerfi heldur svokölluð pólhnit (polar coordinates). Til þess notuð við aðgerðina coord_polar. Til eru fleiri skipanir sem hafa áhrif á hnitakerfi, sjá “svindblað” (cheat sheet) fyrir ggplot2.



ggplot(data = gagnasafn, mapping = aes(x = hvad.er.kl)) + 
  geom_bar() + 
  coord_polar() +
  labs(
    x = "Hvað er klukkan?", 
    y = "quot;Fjöldi þátttakenda"
  )




Mörg gröf á sömu mynd

Hvað ef við viljum sýna fleiri en eina tegund af grafi á sömu myndinni? Ekkert mál! Hér sýnum við t.d. sömu gögnin bæði sem fiðlurit og kassarit:



ggplot(data = gagnasafn, mapping = aes(x = " ", y = haed.cm)) + 
  geom_violin() +
  geom_boxplot() +
  labs(
    x = "Allir þátttakendur", 
    y = "Hver er hæð þín í cm?"
  )




Athugið að gröfin eru teiknuð í þeirri röð sem við skrifum í kóðann. Hér er fiðluritið teiknað fyrst og kassaritið síðan teiknað ofan á það, þar sem við kölluðum fyrst á geom_violin að gerðina og síðan á geom_boxplot. Ef við hefðum gert það öfugt hefði kassaritið horfið fyrir aftan fiðluritið.

Gröf fyrir tvær eða fleiri breytur

Hingað til höfum við bara verið að vinna með eina breytu í einu, svo sem haed.cm eða hvad.er.kl. Oft höfum við samt áhuga á hvernig tvær eða fleiri breytur tengjast. Er t.d. einhver munur á því hvenær þátttakendur sögðust taka könnunina eftir því hvort þeir vissu hvað þeir ætli að verða þegar þeir verða stórir eða ekki? Ekki harla líklegt, en skoðum það samt að gamni (og til að læra að gera flott gröf).

Stöplarit (histogram) með tveimur breytum

Hér ætlum við að skoða samband tveggja breyta, annars vegar hvad.er.kl og hins vegar veistu.hvad.verdur.thegar.stor. Svipað og við höfum áður gert biðjum við R um að:

  • Tengja grafið við gögnin sem geymd eru í breytunni gagnasafn: data = gagnasafn
  • Byggja x-ásinn á breytunni hvad.er.kl: x = hvad.er.kl
  • Endurnefna x- og y-ása labs(x = “Hvað er klukkan?”, y = “Fjöldi þátttakenda”)

Stöplar hlið við hlið

Hér gerum við svo þrennt nýtt:

  • Litum innra byrði stöplanna eftir því hvort fólk veit hvað það ætlar að verða þegar það verður stórt: fill = veistu.hvad.verdur.thegar.stor)
  • Látum hvern stöpul ná yfir þriggja klst. bil: binwidth = 3
  • Segjum R að ekki eigi að stafla stöplunum ofan á hvor annann heldur eigi þeir vera hlið við hlið: position = “dodge”



ggplot(data = gagnasafn, mapping = aes(x = hvad.er.kl, fill = veistu.hvad.verdur.thegar.stor)) + 
  geom_histogram( 
    binwidth = 3, 
    position = "dodge"
  ) + 
  labs(
    x = "Hvað er klukkan?", 
    y = "Fjöldi þátttakenda"
  )




Þetta er áhugavert, mögulega eru kvöldmanneskjurnar lengur að koma sér að verki, þ.m.t. að gera könnun og að ákveða hvað þær ætla að verða þegar þær verða stórar – en kannski er þetta eintóm tilviljun.

Almennt gildir að vilji maður að einhver eiginleiki fari eftir gildum tiltekinnar breytu í gagnasafninu manns, þá ætti maður að skilgreina slíkt inni í aðgerðinni aes rétt eins og við gerum hér með fill – við viljum að fyllingarlitur stöplanna fari eftir því hvort fólk veit hvað það ætlar að verða stór.

Til hliðar við grafið er skýringartexti (legend) sem útskýrir fyrir hvað litirnir sem stöplarnir eru fylltir með tákna (fill = veistu.hvad.verdur.thegar.stor). Athugið þó að þar sem upprunalega breytan hét því þjála nafni veistu.hvad.verdur.thegar.stor á þá er skýringartextinn einnig merktur því nafni. Við getum breytt þessari merkingu sérstaklega með því að gefa aðgerðinni labs (sem er stytting á labels eða merkingum) upplýsingar um að titillinn á skýringartextanum fyrir fill (þ.e. innri lit stöpla) eigi að vera “Veistu hvað þú ætlar að verða þegar þú verður stór?”.

Stöplarit ofan í hvor öðrum

Gerum þetta aftur, en látum í þetta sinn stöplana:

  • Ekki vera hlið við hlið, heldur látum þá “falla inn í hvor annan”: position = “identity”
  • Verða hálfgegnsæa: alpha = 0.5
  • Gefum skýringartextanum nýjan titil: fill = “Veistu framtíðarplön?”



ggplot(data = gagnasafn, mapping = aes(x = hvad.er.kl, fill = veistu.hvad.verdur.thegar.stor)) + 
  geom_histogram( 
    binwidth = 3,
    position = "identity", 
    alpha = 0.5
  ) + 
  labs(
    x = "Hvað er klukkan?", 
    y = "Fjöldi þátttakenda", 
    fill = "Veistu framtíðarplön?"
  )




Mörg gröf í einu

Í gröfunum hér að ofan er e.t.v.nokkuð erfitt að átta sig á mun á dreifingu klukkutímanna eftir því hvort fólk viti hvað það ætlar að verða þegar það verður stórt (Já/Nei) þar sem dreifingin fyrir hvort um sig skarast mikið. Stundum er betra að gera eitt graf fyrir hvert gildi tiltekinnar breytu, svo sem eitt graf fyrir “Já” og annað graf fyrir “Nei”. Við getum gert það með aðgerðinni facet_grid:



ggplot(data = gagnasafn, mapping = aes(x = hvad.er.kl)) + 
  geom_histogram(
    binwidth = 3
  ) + 
  labs(
    x = "Hvað er klukkan?", 
    y = "Fjöldi þátttakenda"
  ) + 
  facet_grid( . ~ veistu.hvad.verdur.thegar.stor)




Með hjálp facet_grid teiknaðir þú eitt stöplarit fyrir hvert gildi veistu.hvad.verdur.thegar.stor; gildin eru tvö (Já/Nei) svo þess vegna urðu til tvö gröf. Gröfin eru sett hlið við hlið. Ef þú hefðir skrifað facet_grid(veistu.hvad.verdur.thegar.stor ~ . ) í stað facet_grid( . ~ veistu.hvad.verdur.thegar.stor) hefði annað þeirra verið sett fyrir ofan hitt.

Súlurit með tveimur breytum

Súlurit henta vel til að skoða tengsl nafn- eða raðbreyta. Í stað þess að skoða súlurit fyrir hvað fólk sagði hvað klukkan væri skulum við frekar nota súlurit til að skoða tengsl tveggja tvíkostabreyta (binary variables), þ.e. breyta sem hvor um sig tekur tvö gildi. Breyturnar eru hvort fólk sé í svörtum sokkum og hvort fólk viti framtíðarplön sín. Látum hina fyrri á x-ás og látum hina síðari ráða innri lit súlna:



ggplot(data = gagnasafn, mapping = aes(x = eru.sokkar.svartir, fill = veistu.hvad.verdur.thegar.stor)) + 
  geom_bar() +
  labs(
    x = "Ertu í svörtum sokkum núna?", 
    y = "Fjöldi þátttakenda",
    fill = "Veistu framtíðarplön?"
  ) 




Á súluritinu að ofan sést vel að um tvöfalt fleiri þátttakendur eru í sokkum af öðrum lit en svörtum. Enn fremur sést dreifing á “framtíðarplönum”” innan hvors “sokkahóps” vel.

Að ofan var súlunum staflað ofan á hvor aðra. Ef við viljum frekar koma þeim fyrir hlið við hlið getum við bætt við position = “dodge”:



ggplot(data = gagnasafn, mapping = aes(x = eru.sokkar.svartir, fill = veistu.hvad.verdur.thegar.stor)) + 
  geom_bar(
    position = "dodge"
  ) +
  labs(
    x = "Ertu í svörtum sokkum núna?", 
    y = "Fjöldi þátttakenda",
    fill = "Veistu framtíðarplön?"
  ) 




Þar sem mun færri eru í svörtum sokkum er ekki er e.t.v. erfitt að bera hlutfallslega dreifingu innan hvors hóps saman. Ef við viljum frekar sýna hlutfall af heild í stað fjölda getum við beðið um position = “fill”:



ggplot(data = gagnasafn, mapping = aes(x = eru.sokkar.svartir, fill = veistu.hvad.verdur.thegar.stor)) + 
  geom_bar(
    position = "fill"
  ) +
  labs(
    x = "Ertu í svörtum sokkum núna?", 
    y = "Hlutfall þátttakenda",
    fill = "Veistu framtíðarplön?"
  ) 




Þéttnirit (density plot) með tveimur breytum

Sýnum nú muninn á hópunum tveimur með þéttniriti. Athugið að þéttniritið sýnir ekki fjölda þátttakenda heldur hlutfallslega dreifingu þátttakenda innan hvors hóps (veit/veit ekki hvað verður þegar stór). Við biðjum um að þéttniritin verði hálfgegnsæ (alpha = 0.5) til þess að dreifing innan hvors hóps sjáist ve.



ggplot(data = gagnasafn, mapping = aes(x = hvad.er.kl, fill = veistu.hvad.verdur.thegar.stor)) + 
  geom_density(
    alpha = 0.5
  ) + 
  labs(
    x = "Hvað er klukkan?", 
    y = "Þéttni (density)"
  )




Kassarit (box plot) með tveimur breytum

Enn ein leiðin til að sýna mun á dreifingu einhverrar breytu er að teikna kassarit hjálp aðgerðarinnar geom_boxplot. Kassarit sýnir aftur á móti hluti á borð við miðgildi (median) sem hefur ekki skýra merkingu þegar um er að ræða breytu eins og hvad.er.klukkan sem bókstaflega gengur í hringi; það er t.d. ekki ljóst – og jafnvel rangt – að segja að kl. 23 um kvöld sé “meira” en kl. 2 um nótt bara af því að tölustafurinn er hærri.

Notum frekar aðra samfellda (continuous) breytu, haed.cm, þar sem þar er alveg ljóst að 23 cm er virkilega meira en 2 cm, svo dæmi sé tekið. Þá hefur það einhverja merkingu að reikna meðaltal, miðgildi og annað slíkt. Skoðum hæðina á fólki eftir því hvort það veit eða veit ekki hvað það ætlar að verða þegar það verður stórt. Er fyrri hópurinn kannski hærri að jafnaði en hinn síðari?

Við biðjum R um að skrá á x-ás hvort það viti framtíðarplön sín og skrá hæð fólks á y-ás. Einnig endurnefnum við x- og y-ás.



ggplot(data = gagnasafn, mapping = aes(x = veistu.hvad.verdur.thegar.stor, y = haed.cm)) + 
  geom_boxplot() +
  labs(
    x = "Veistu hvað þú ætlar að verða þegar þú verður stór?", 
    y = "Hver er hæð þín í cm?"
  )




Kassaritið sýnir að fólkið í fyrri hópnum er að jafnaði örlítið hærra en fólkið í síðari hópnum. Ekki er þó mikill munur á hæðardreifingu fólks eftir því hvort framtíðarplön þess séu ljós – enda væri það heldur undarlegt.

Fiðlurit (violin plot) með tveimur breytum

Sýnum sömu gögn og voru á kassaritinu hér fyrir ofan, en nú á fiðluriti. Allar skipanir eru þær sömu, nema hvað við skrifum geom_violin í stað geom_boxplot. Þá fæst fiðlurit sem sýnir hæðardreifingu hópanna tveggja:



ggplot(data = gagnasafn, mapping = aes(x = veistu.hvad.verdur.thegar.stor, y = haed.cm)) + 
  geom_violin() +
  labs(
    x = "Veistu hvað þú ætlar að verða þegar þú verður stór?", 
    y = "Hver er hæð þín í cm?"
  )




Dritrit (scatter plot) með tveimur breytum

Vilji maður sýna tengsl tveggja samfellra (continuous) breyta getur hentað vel að sýna slíkt á dritriti (scatter plot). Önnur breytan, gjarnan frumbreyta, er sýnd á x-ás og hin, gjarnan fylgibreyta, er sýnd á y-ás.

Í gagnasafninu okkar erum við með upplýsingar um:

  • Hvað klukkan var í raun og veru þegar fólk skilaði inn könnuninni: timastimpill
  • Hvað fólk sagði að klukkan væri þegar við spurðum það: hvad.er.kl

Nú ætlum við að skoða hversu mikið samræmi er þar á milli, en ekki ætti að skeika miklu nema fólk annað hvort ljúgi eða ruglist. Við prófum að skoða samband þessara tveggja breyta á dritriti. Dritrit sýnir gildi hvers þátttakanda á báðum breytum (x og y) sem einn punkt. Við getum gert dritrit með því að kalla á aðgerðina geom_point:



ggplot(data = gagnasafn, mapping = aes(x = timastimpill, y = hvad.er.kl)) + 
  geom_point() +
  labs(x = "Hvenær var könnun send inn (sjálfvirk tímaskráning)?", y = "Hvað er klukkan samkvæmt þátttakanda?")




Dritritið að ofan sýnir að það er greinilega eitthvert mynstur í gögnunum; almennt gildir að sjálfvirka tímastimplunin og það hvar þátttakendur sögðu sjálfir að klukkan væri fylgist að.

Það er samt eithtvað skrýtið í gangi – punktarnir mynda ekki eina heldur tvær skálínur á grafinu. Ef fólk fyllti samviskulega út hvað klukkan væri ætti aðeins að vera ein slík skálína á grafinu – sú efri – en hjá sumum þátttakendum skeikar mjög mörgum klukkutímum á því hvað klukkan er í raun og hvað þeir segja að klukkan sé. Hvað er þarna í gangi? Eru þátttakendur bara að ljúga?

Alllíklegt er að þátttakendur séu að svara eftir bestu vitund, en að þeir hafi ekki skráð tímann samkvæmt 24 stunda kerfi heldur 12 stunda kerfi. Fólk sem svaraði kl. 20 sagði því e.t.v. að klukkan væri 8. Þetta minnir mann á tvennt:

  • Maður VERÐUR að skoða gögnin sín, villur og önnur undarlegheit sjást oft best á grafi
  • Best er að koma í veg fyrir villurnar yfir höfuð, t.d. með því að spyrja fólk beint út hvort klukkan sé átta að morgni eða kvöldi

Dritrit (scatter plot) með þremur breytum

Við skulum sýna þessi gögn aftur, en reynum nú að draga athyglina að þessum tveimur hópum, þ.e. þeim sem misskildu líklega hvernig skrá átti hvað klukkan væri og þeim sem skráðu tímann réttilega. Í gagnasafninu eru eftirfarandi breytur sem við getum notað til að gera það:

  • skeikar.um.klst sýnir hversu mörgum klukkustundum munar á hvenær könnun var send inn samkvæmt sjálfvirkri tímaskráningu og svo hvað þátttakandi sagði að klukkan væri.
  • timi.rett.skradur fær gildin gildin Já ef ekki skeikar nema að hámarki 3 klst á tímastimplun og svari þátttakandans, annars Nei.

Skoðum skeikar.um.klst breytuna okkar á grafi:



ggplot(data = gagnasafn, mapping = aes(x = skeikar.um.klst)) + 
  geom_bar() + 
  labs(x = "Um hve margar klst. skeikar svörum?", y = "Fjöldi þátttakenda")




Á grafinu fyrir ofan sést að langflestir þátttakendur sögðu að klukkan væri nákvæmlega það sama og hún var í raun þegar þeir skiluðu könnuninni (skeikar.um.klst breytan hefur gildið 0). Hjá allnokkrum skeikaði um eina klst., aðeins færri um tvær og enn færri um þrjár. Annar toppur finnst síðan kringum 12 klst., en það er einmtt í samræmi við að hluti þátttakenda hafi skráð tímann á skalanum 1-12 í stað 1-24.

Nú skulum við loksins teikna dritiritið okkar til þess að skoða hvernig sambandið er á milli sjálfvirkrar (timastimpill) og handvirkrar (hvad.er.kl) tímaskráningar, annars vegar fyrir þá sem skráðu líklega tímann rétt og hins vegar fyrir þá sem skráðu tímann rangt (timi.rett.skradur).

Gefum aðgerðinni aes eins og áður þær upplýsingar að timastimpill skuli vera á x-ás og hvad.er.kl á y-ás, en gefum aðgerðinni enn fremur þær upplýsingar að lita eigi punktana eftir þriðju breytunni timi.rett.skradur. Aðgerðinni labs getum við svo upplýsingar um nýjar merkingar á öllum breytum, þ.e. breytunum sem notaðar eru til að stjórna x-ási, y-ási og lit:



ggplot(data = gagnasafn, mapping = aes(x = timastimpill, y = hvad.er.kl, color = timi.rett.skradur)) + 
  geom_point() +
  labs(
        x = "Hvenær var könnun send inn (sjálfvirk tímaskráning)?", 
        y = "Hvað er klukkan samkvæmt þátttakanda?", 
        color = "Er tíminn rétt skráður?"
       )




Við getum leikið okkur enn frekar. Prófum til dæmis að gera eftirfarandi breytingar:

  • Hnikum hverjum gagnapunkti örlítið til (jitter) til að hægt sé að gera greinarmun á gagnapunktum tveggja eða fleiri þátttakenda með alveg eins gildi: geom_jitter()
  • Teiknum bestu línu: geom_smooth(method = lm)



ggplot(data = gagnasafn, mapping = aes(x = timastimpill, y = hvad.er.kl, color = timi.rett.skradur)) + 
  geom_jitter() +
  geom_smooth(method = lm) +
  labs(
        x = "Hvenær var könnun send inn (sjálfvirk tímaskráning)?", 
        y = "Hvað er klukkan samkvæmt þátttakanda?", 
        color = "Er tíminn rétt skráður?"
       ) 




Besta línu er sýnd fyrir hvern undirhóp, þ.e. þá sem skráðu tímann sinn rétt og þá sem skráðu tímann sinn rangt. Ef við hefðum gert einfaldara drifrit sem einungis sýndi samband x og y (en hefði engar upplýsingar um undirhópa) þá hefði jafna bestu línu verið teiknuð fyrir öll gögnin í gagnasafninu óháð hópi.

Meðaltöl (means), staðalfrávik (standard deviations), öryggisbil (confidence intervals) og villustrik (error bars)

Meðaltöl á súluriti

Segjum sem svo að þú viljir teikna einfalt súlurit sem sýnir hversu bragðvondar eða bragðgóðar fólki finnist finnst ólífur (á skalanum 1-5 þar sem 1 táknar mjög bragðvondar og 5 mjög bragðgóðar) eftir því hversu ósammála eða sammála það er fullyrðingunni að tómatar séu ávextir (á skalanum 1-5 þar sem 1 táknar mjög ósammála og 5 mjög sammála).

Þú getur gert þetta með hjálp stat = “summary” sem segir R að taka eigi saman (summarize) gögnin, nánar tiltekið að fyrir breytuna á y-ás (ólífuspurninguna) eigi að taka meðaltal (fun.y = “mean”):



ggplot(data = gagnasafn, mapping = aes(x = tomatar.eru.avextir, y = hve.vondar.godar.olifur)) + 
  geom_bar(
    stat = "summary", 
    fun.y = "mean"
  ) +
  labs(
    x = "Hversu ósammála eða sammála ertu eftirfarandi fullyrðingu? Tómatar eru ávextir", 
    y = "Hversu bragðvondar/bragðgóðar finnst fólki ólífur (meðaltal)?"
  )




Á grafinu sést að eftir því sem fólk tekur meira undir að tómatar séu ávextir þá fílar það að jafnaði ólífur betur.

Meðaltöl á línuriti (line graph)

Er hægt að nota tæknina sem notuð var hér að ofan til að gera slíkt fyrir annars konar gröf? Sei, sei, já!

Línurit fyrir tvær breytur

Segjum t.d. að við höfum áhuga á að sjá línurit sem sýnir meðalhæðs fólks sem svaraði könnuninni á mismunandi tímum samkvæmt sjálfvirkri tímastimplun. Línurit henta almennt vel til að fylgjast með þróun fyrirbæris, til dæmis hvernig eitthvað breytist með tímanum.



ggplot(data = gagnasafn, aes(x = timastimpill, y = haed.cm)) +
  geom_line(
    stat = "summary", 
    fun.y = "mean"
  ) +
  labs(
    x = "Hvenær var könnun send inn (sjálfvirk tímaskráning)", 
    y = "Meðalhæð (cm)"
  )




Eins og með alla gagnaúrvinnslu þá þarf að fara varlega í að túlka gröf. Hvað er t.d. málið með að þeir sem ljúka könnuninni kl. 7 að morgni séu svona hávaxnir að meðaltali? Ef við skoðuðum aftur á móti gagnasafnið kæmi í ljós að “meðaltalið” er í raun meðalhæð nákvæmlega einnar manneskju, einhvers morgunhana sem einn þátttakenda sendi könnunina inn á þessum óguðlega tíma.

Línurit fyrir þrjár breytur

Línurit geta hentað vel þegar þróun er fylgt eftir yfir langt tímabil og/eða þegar fylgst er með þróun margra fyrirbæra, enda getur verið óþægilegt að horfa á mjög margar súlur eða stöpla. Prófum að gamni að gera línurit sem sýnir það sama og áður, nema nú verða línurnar tvær: Önnur táknar fólk í svörtum sokkum og hin táknar fólk sem ekki er í svörtum sokkum:



ggplot(data = gagnasafn, aes(x = timastimpill, y = haed.cm, color = eru.sokkar.svartir)) +
  geom_line(
    stat = "summary", 
    fun.y = "mean"
  ) +
  labs(
    x = "Hvenær var könnun send inn (sjálfvirk tímaskráning)", 
    y = "Meðalhæð (cm)",
    color = "Ertu í svörtum sokkum núna?"
  )




Að ofan ætti nú að sjást hið gífurlega hávísindalega línurit sem sýnir meðalhæð fólks eftir tímaskráningu, annars vegar fyrir fólk í svörtum sokkum og hins vegar fyrir fólk í annars konar sokkum. Athugið að ekki eru endilega gagnapunktar til fyrir öll möguleg gildi tímaskráningu og er það m.a. ástæða þess að rauða línan byrjar ekki fyrr en á x-hniti 6, en enginn sem var í svörtum sokkum sendi könnunina inn fyrir þann tíma.

Staðalfrávik og villustrik

tomatar.eru.avextir tekur gildin 1-5 svo við skulum kalla þetta tómatahópana fimm. Vissulega er einhver meðaltalsmunur á “ólífufílingi” tómatahópanna, en innan hvers tómatahóps er auðvitað einhver dreifing á ólífufílingi.

Staðalfrávik innan hvors hóps getur gefið okkur ágætis upplýsingar um dreifingu; því hærra sem staðalfrávikið er, þeim mun meiri er dreifing ólífufíling. Stundum er dreifing gagna um meðaltal því gefin til kynna myndrænt með því að teikna staðalfrávikin sem svokölluð villustrik (error bars). Oft ná þau frá einu staðalfráviki fyrir neðan meðaltal að einu staðalfráviki fyrir ofan meðaltal ( +/- eitt staðalfrávik).

Við ætlum að teikna slík villustrik inn á grafið okkar, en áður en við getum það þurfum við að ná í pakkann Hmisc:



install.packages("Hmisc")



Og svo þurfum við að gera pakkann tiltækan:



library("Hmisc")



Nú getum við teiknað grafið. mean_sdl reiknar út meðaltal ásamt efri og neðri mörkum frá meðaltali. Við látum mult = 1 til að segja að neðri mörk eigi að vera eitt staðalfrávik fyrir neðan meðaltal og að efri mörk eigi að vera eitt staðalfrávik fyrir ofan meðaltal. geom = “errorbar” lætur vita að við viljum nýta þessar upplýsingar til að ráða hæð villustrikanna (error bars). Að lokum ræður width = 0.3 breidd villustrikanna:



ggplot(data = gagnasafn, mapping = aes(x = tomatar.eru.avextir, y = hve.vondar.godar.olifur)) + 
  geom_bar(
    stat = "summary", 
    fun.y = "mean"
  ) +
  labs(
    x = "Hversu ósammála eða sammála ertu eftirfarandi fullyrðingu? Tómatar eru ávextir", 
    y = "Hversu bragðvondar eða bragðgóðar finnst þér ólífur?"
  ) +
  stat_summary(
    fun.data = mean_sdl, 
    fun.args = list(mult = 1),
    geom = "errorbar",
    width = 0.3
  )




Öryggisbil og villustrik

Á grafinu að ofan voru villustrik teiknuð +/- 1 staðalfrávik frá meðaltali. Enn algengara er þó e.t.v. að láta villustrikin afmarka 95% öryggisbil (confidence interval) fyrir meðaltalið. Við getum gert grafið aftur en nú tákna villustrikin slík öryggisbil:



ggplot(data = gagnasafn, mapping = aes(x = tomatar.eru.avextir, y = hve.vondar.godar.olifur)) + 
  geom_bar(
    stat = "summary", 
    fun.y = "mean"
  ) +
  labs(
    x = "Hversu ósammála eða sammála ertu eftirfarandi fullyrðingu? Tómatar eru ávextir", 
    y = "Hversu bragðvondar eða bragðgóðar finnst þér ólífur?"
  ) +
  stat_summary(
    fun.data = mean_cl_normal, 
    geom = "errorbar",
    width = 0.3
  )




Útlit grafs

Hingað til höfum við ekki reynt að hafa mikil áhrif á útlit grafanna okkar. Í raun létum við R ákveða ýmislegt fyrir okkur á bak við tjöldin. Við getum aftur á móti haft mikla stjórn á útliti grafs.

Að stjórna útliti grafs handvirkt

Nú skulum við prófa að skoða hæðardreifingu þátttakenda aftur á stöplariti, en skilgreinum eftirfarandi:

  1. Hvert bil (bin) verði 2 cm
  2. Útlínur stöplanna verði fjólubláar
  3. Stöplarnir verði fylltir með gulum lit
  4. Stöplarnir verði hálfgegnsæir
  5. X-ásinn nái frá 170 cm að 205 cm og y-ás frá 0 til 20
  6. Tikkmerki (tick marks) verði sett á x-ás á fimm cm fresti
  7. Báðum ásum verði gefnir lýsandi titlar

Þetta getum við gert svona (ath. passið vel upp á sviga, punkta, gæsalappir o.fl.):



ggplot(data = gagnasafn, mapping = aes(x = haed.cm)) + 
  geom_histogram(
    binwidth = 2,
    color="blueviolet", 
    fill="yellow",
    alpha = 0.2
  ) + 
  coord_cartesian(
    xlim = c(170, 205), 
    ylim = c(0, 20)
  ) + 
  scale_x_continuous(
    breaks = seq(170, 205, 5)
  ) +
  labs(
    x = "Hæð (cm)", 
    y = "Fjöldi þátttakenda"
  ) 




Skipunin byrjar eins og áður á ggplot(data = gagnasafn, mapping = aes(x = haed.cm)) + þar sem við segjum R að búa til graf, tengja það við gagnasafn, og bygga x-ás á hæð þátttakenda (og y-ás á fjölda þeirra). Næsta lína er sömuleiðis kunnugleg þar sem hún segir R að teikna stöplarit með hjálp aðgerðarinnar geom_histogram.

Aðgerðin geom_histogram er svo mötuð á ýmsum upplýsingum:

  • binwidth (hvað hvert bil á að vera stórt)
  • color (hvernig útlínur stöplanna eiga að vera á litinn)
  • fill (með hvaða lit á að fylla stöplana)
  • alpha (hversu gegnsæir stölparnir eiga að vera, þar sem 0.0 merkir fullkomlega gegnsætt og 1.0 merkir fullkomlega ógegnsætt).

Það er hægt að setja miklu fleiri stillingar, en um það getiði t.d. fræðst með því að skrifa kóðann ?geom_histogram sem opnar hjálparsíðu aðgerðarinnar. Hér má svo lesa nánar um liti, m.a. hvað þeir heita.

Ekki skiptir neinu sérstöku máli í hvaða röð við tilgreinum þessa fjóra eiginleika; enn fremur er ekkert sérstakt sem segir að við þurfum að setja hvern eiginleika í sérstaka línu. Við hefðum allt eins getað skrifað þetta svona allt í einni línu og fengið sömu niðurstöðu: geom_histogram(alpha = 0.2, color=“blueviolet”, binwidth = 2, fill=“blue”) + Mér er nokk sama um röðina, en það er gott að venja sig á að skrifa ekki kóða í belg og biðu heldur skipta á milli lína þar sem hægt er þannig að kóðinn verði skýr og læsilegur. Takið þó eftir plúsmerkinu á eftir sviganum, en það segir að ætlunin sé að bæta enn frekar við skipunum/lögum.

Næsta mál á dagskrá er að stilla stærð ásanna þannig að x-ás nái frá 170-205 cm og y-ás frá 0 til 20. Það er gert með því að kalla á aðgerðina coord_cartesian. Athugið að þetta er aðeins útlitsleg breyting – öll gögnin eru þarna ennþá en það er eins og við höfum “súmmað” inn á hluta grafsins á milli 150 og 205 cm á x-ás og á milli 0 og 20 á y-ás.

Til þess að stjórna tikkmerkjum á x-ás köllum við á aðgerðina scale_x_continuous, en til er samsvarandi aðgerð fyrir y-ás. Við segjum að merkja eigi á milli 170 cm og 205 cm með 5 cm millibili.

Að lokum köllum við á aðgerðina labs (stytting á labels) með skipuninni labs(x = “Hæð (cm)”, y = “Fjöldi þátttakenda”) þar sem við látum x-ás fá titilinn Hæð (cm) og y-ás titilinn Fjöldi þátttakenda.

Að stjórna útliti grafs með þemum

Ef þú vilt þá geturðu nær fullkomlega stjórnað útliti grafsins þíns með handafli, rétt eins og við gerðum hér fyrir ofan. Hægt er að stilla mun fleiri eiginleika heldur en þá sem við áttum við hér í grafinu hér fyrir ofan.

Það er aftur á móti önnur leið til, nefnilega að stórna útliti grafs með þema (theme). Þemu skilgreina alls konar útlitsþætti grafs, t.d. lit og leturstærð. Hægt er að láta þemu ráða öllu útliti grafs, eða þá að hægt er að kalla á þema en skilgreina einnig suma þætti sjálfur (svo sem að skilgreina sjálf fill=“blue”).

Ef ekkert þema er valið notar R sjálfvalið þema sem kallast theme_gray. Prófum aftur á móti að setja þema að nafni theme_minimal. Við skilgreinum sumt sjálf, eins og bilstærð (binwidth), en látum þemað um að velja gildi fyrir ýmislegt annað “á bak við tjöldin”:



ggplot(data = gagnasafn, mapping = aes(x = haed.cm)) + 
  geom_histogram(
    binwidth = 3
  ) + 
  labs(
    x = "Hæð (cm)", 
    y = "Fjöldi þátttakenda"
  ) +
  theme_minimal()




ggplot2 pakkinn er með fleiri þemu (hér má sjá dæmi). Auk þess eru til fleiri þemu í öðrum pökkum. Náum okkur í einn pakka til viðbótar, pakkann ggthemes (sjá dæmi um þemu hér). Eins og með aðra pakka þarf aðeins að ná í hann einu sinni:



install.packages("ggthemes")



Ef við viljum aftur á móti gera pakkann tiltækan þarf að tilkynna R það:



library("ggthemes")



Gerum stöplaritið aftur, en nú með þema úr ggthemes pakkanum sem kallast theme_tufte. Þemað er gert eftir tilmælum Edward Tufte sem er einn helsti gúrúinn á sviði myndrænnar framsetningar gagna, sjá Edward Tufte á Wikipedia:



ggplot(data = gagnasafn, mapping = aes(x = haed.cm)) + 
  geom_histogram(
    binwidth = 3
    ) + 
  coord_cartesian(
    xlim = c(150, 205)
    ) + 
  labs(
    x = "Hæð (cm)", 
    y = "Fjöldi þátttakenda"
  ) +
  theme_tufte()




Þegar þið gerið myndir getiði þó að sjálfsögðu valið ykkur annað þema. Almennt séð mæli ég með einföldum og skýrum þemum á borð við theme_tufte.

Að breyta röð gilda

Súlurit (bar charts) henta vel til samanburðar, sérstaklega til að bera saman eðlisólík atriði (á nafnkvarða). Notum nú súlurit bæði upprétt og á hlið til að skoða dreifingu breytunnar hvar.situr (Hvar siturðu yfirleitt í kennslustundum?). Hún tekur gildin Aftast, Í miðjunni og Fremst og er því tæknilega séð raðbreyta (Aftast < Í miðjunni < Fremst). R veit aftur á móti ekkert um það þar sem það er ekkert í gagnaskránni sjálfri sem gefur til kynna röð gildanna – nema þá bara stafrófsröð.

Prófum fyrst að sýna hvernig þátttakendur sitja í kennslustund með því að búa til upprétt súlurit. Keyrðu eftirfarandi kóða:



ggplot(data = gagnasafn, mapping = aes(x = hvar.situr)) + 
  geom_bar() + 
  labs(x = "Hvar siturðu yfirleitt í kennslustundum?", y = "Fjöldi þátttakenda")




Hér sést nokkuð vel að flestir segjast sitja í miðjunni og fæstir sitja fremst. Aftur á móti eru gildin í asnalegri röð; R raðar þeim eftir stafrófsröð sem er ekki endilega það sem við viljum.

Að búa til raðbreytu

Ef við viljum að grafið okkar endurspegli að Aftast er í einhverjum skilningi minna en Í miðjunni sem aftur er minna en Fremst þá getum við breytt gagnagerð breytunnar hvar.situr í raðbreytu (ordered factor). Við getum gert það með því að kalla á aðgerðirnar mutate (sjá nánar hér) og factor. Prófum það:



gagnasafn <- mutate(  gagnasafn, 
                      hvar.situr = factor(  hvar.situr, 
                                            ordered = TRUE, 
                                            levels = c("Aftast", "Í miðjunni", "Fremst")
                                         )
                   )



Við gáfum aðgerðinni factor efirfarandi upplýsingar með því að setja þær inn í sviga á eftir nafni aðgerðarinnar:

  1. Hvaða breyta í geymir upprunalegu gögnin: hvar.situr
  2. Að við viljum að breytan sé röðuð: ordered = TRUE
  3. Hvernig við viljum að gildum breytunnar sé raðað, frá minnsta til stærsta gildis: levels = c(“Aftast”, “Í miðjunni”, “Fremst”)

Hér er svo ágætt að minna á að R er stafrétt, þ.e. gerir greinarmun á há- og lágstöfum. Ef þú skrifar true í staðinn fyrir TRUE færðu bara villu. Ef þú skrifar aftast í stað Aftast gerir R ráð fyrir að enginn hafi setið aftast því orðið aftast með lágstöfum kom aldrei fyrir í hvar.situr.

Í raun skilar mutate aðgerðin af sér nýju og breyttu gagnasafni en þar sem við ætlum að yfirskrifa gamla gagnasafnið okkar geymum við nýja gagnasafnið einnig í breytunni gagnasafn. Við notum gildingarvirkjann <- til þess að setja útkomu þess sem er hægra megin við hann í breytuna gagnasafn okkar vinstra megin við hann. Athugið að við breyttum gagnasafninu eins og það er skráð í R, en upprunalega Excelskráin okkar er óbreytt. Við erum að vinna með afrit af gögnunum úr Excelskránni, ekki Excelskrána sjálfa.

Af því að hvar.situr í gagnasafn er nú orðin raðbreyta hefur R vit á að sýna gögnin í réttri röð á grafinu:



ggplot(data = gagnasafn, mapping = aes(x = hvar.situr)) + 
  geom_bar() + 
  labs(
    x = "Hvar siturðu yfirleitt í kennslustundum?", 
    y = "Fjöldi þátttakenda"
  )




Að raða gildum eftir tíðni

Þetta er nú aldeilis fínt. En hvað ef við viljum ekki hafa þetta í röðinni aftast/miðja/fremst á grafinu, heldur fremur eftir fjölda þátttakenda sem völdu hvern svarmöguleika? Við getum alveg gert það, en það er ekki sérlega góð hugmynd að breyta röðinni Aftast < Í miðjunni < Fremst í sjálfri raðbreytunni hvar.situr í gagnasafn, enda er það hin eiginlega rétta röð gildanna.

Í þetta sinn ætlum við því ekki að snerta gögnin sjálf sem geymd eru í gagnasafn, heldur ætlum við einungis að hafa áhrif á það hvernig gögnin birtast á myndritinu. Eins og með margt í R er hægt að gera þetta á fleiri en einn hátt, en við ætlum að nota til þess aðgerðina fct_infreq sem er að finna í pakkanum forcats. Pakkinn er til þess ætlaður að vinna með nafn- og raðbreytur (factors/ordered factors).

forcats er hluti af tidyverse og því þarf ekki að ná í forcats pakkann sérstaklega ef búið er að ná í tidyverse pakkann. Aftur á móti þarf að gera pakkann tilbúinn til notkunar:



library("forcats")



Nú þegar forcats pakkinn er tiltækur getum við kallað á fct_infreq aðgerðina í honum. Við notum aðgerðina til að raða gildum eftir tíðni (frequency) hvers gildis, þ.e. frá mesta til minnsta fjölda þátttakenda:



ggplot(data = gagnasafn, mapping = aes(x = fct_infreq(hvar.situr))) + 
  geom_bar() + 
  labs(
    x = "Hvar siturðu yfirleitt í kennslustundum?", 
    y = "Fjöldi þátttakenda"
  )




Ef við viljum hafa þetta akkúrat öfugt, þ.e. frá minnsta til mesta fjölda þátttakenda, þá getum við gert það með hjálp aðgerðarinnar fct_infreq, sem raðar eftir tíðni, ásamt aðgerðinni fct_rev sem tekur hvaða röð sem er og snýr henni við (reverse):



ggplot(data = gagnasafn, mapping = aes(x = fct_rev(fct_infreq(hvar.situr)))) + 
  geom_bar() + 
  labs(
    x = "Hvar siturðu yfirleitt í kennslustundum?", 
    y = "Fjöldi þátttakenda"
  )




Að svissa ásum

Ef við viljum sýna hvar fólk situr á y-ási frekar en x-ási getum við teiknað grafið líkt og áður en kallað á aðgerðina coord_flip() líkt og við gerðum raunar hér fyrir ofan á kassariti:



ggplot(data = gagnasafn, mapping = aes(x = hvar.situr)) + 
  geom_bar() + 
  labs(
    x = "Hvar siturðu yfirleitt í kennslustundum?", 
    y = "Fjöldi þátttakenda"
  ) +
  coord_flip()




Að vista gröf

Ef þú hefur þrælað þér í gegnum allt þetta skjal ættirðu að verða orðin(n) nokkuð slyng(ur) við að búa til gröf með hjálp R og ggplot2. Það væri þó til lítils ef þú gætir síðan ekki vistað öll fínu gröfin þín.

Eftirfarandi kóði sýnir dreifingu svara við spurningunni um hvort tómatar séu ávextir (en mjög skiptar skoðanir eru á því!) og vistar svo grafið sem png-skjal. Hægt væri að biðja um annars konar skráartegund, svo sem jpeg, bmp eða pdf. Einnig biðjum við sérstaklega um að myndin verði 30 cm að breidd og 20 cm að hæð.



ggplot(data = gagnasafn, mapping = aes(x = tomatar.eru.avextir)) + 
  geom_bar() + 
  labs(
    x = "Hversu ósammála eða sammála ertu eftirfarandi fullyrðingu? Tómatar eru ávextir", 
    y = "Fjöldi þátttakenda"
  ) +
  ggsave(
    filename = "tomatar.png", 
    width = 30, 
    height = 20, 
    units = "cm"
  )




Til hamingju! Þú ert búin(n) að vista fyrsta grafið þitt!