R – Datan visualisointi

R Ei kommentteja

Sisältö


R-ohjelmointikielen suosiota selittää sen laajat mahdollisuudet aineiston eli datan visualisointiin ja jopa animointiin useilla helppokäyttöisillä paketeilla. R:n peruspaketissa (base) on luonnollisesti mahdollisuus tehdä helposti kuvioita. Lisäksi on kuitenkin suosittuja paketteja kuten ggplot2 ja lattice, joiden avulla kuvien ulkoasuun voidaan vaikuttaa selkeästi enemmän ja lisäksi tehdä niistä julkaisukelpoisia.

Tässä artikkelissa keskitytään ggplot2 -pakettiin, sillä se on R:n visualisointipaketeista suosituin, ja siihen löytyy eniten ohjeita ja apua helposti netistä.

ggplot2

ggplot2 on R-ohjelmointikielelle kehitetty paketti, jonka tavoitteena on mahdollistaa esteettisesti kaunis datan visualisointi, ja tehdä siitä vielä tehokasta ja toistettavaa. ggplot2 perustuu nimensä mukaisesti The Grammar of Graphics -viitekehykseen, jonka tavoite moniulotteisen datan visualisointi 2D-kuvissa. ggplot2 itsessään sisältää funktiot eli komennot, joilla voidaan luoda lähes kaikki peruskuvaajat, ja sen lisäosat (kuten esim. ggsurvplot survival-analyysiä varten tai gganimate animoitujen kuvaajien luomiseen) mahdollistavat vielä monimutkaisempien kuvien luomisen. Käytännössä tällä paketilla ja sen lisäosilla voit luoda lähes mitä vain mielikuvituksen rajoissa.

Käyttö

ggplot2:n käytön selittäminen on haastavaa sen taustalla olevan filosofian vuoksi, mutta paketin käyttäminen itsessään on helppoa sen toimintalogiikan ymmärtämisen jälkeen.

Koodi alkaa aina funktiolla ggplot(), jonka sisään tulee komento aes(), joka tulee englannin termistä aesthetic mapping. aes() -komennolla funktioon määritetään muuttujat, joiden perusteella kuvaaja luodaan ja joita kuvaaja siten kuvaa. aes() -komentoon on tärkeä muistaa laittaa kaikki muuttujat, jotka halutaan kuvaajassa visualisoida ja lisäksi laittaa ne oikeassa järjestyksessä (x- ja y-akseli, ryhmittelevä muuttuja).

ggplot() -rivin jälkeen lisätään uusia kerroksia (eng. layer) sen mukaan, millainen kuvaajaa halutaan tehdä. Uudet rivit lisätään kuvaajan koodiin lisäämällä rivin loppuun merkki + ja jatkamalla seuraavalta riviltä. Kuvaajan valinta tapahtuu funktiolla geom_* (geometria), ja näiden kahden rivin avulla saadaan kuva jo näkyviin. Jokaisessa geom_* vaihtoehdossa on omat erityispiirteensä, joita käsitellään seuraavassa osiossa. Näiden jälkeen käydään läpi kaikille kuvatyypeille yhteisiä, yleisiä piirteitä ja ominaisuuksia.

Eri kuvaajavaihtoehdot voi aina tarkistaa esim ggplot2 cheatsheetistä. Alla on listattuna yleisimmin käytetyt kuviotyypit:

Pisteparvikuva (geom_point)

Pisteparvikuva on hyödyllinen tapa visualisoida aineistoa, kun käsiteltävänä on kaksi jatkuvaa muuttujaa. Pisteparvikuviolla voidaan tarkastella muuttujien jakaumia, sekä niiden välistä korrelaatiota. Otetaan esimerkiksi R – Kuinka päästä alkuun? -artikkelin esimerkkikuva: mtcars -aineistossa olevien ajoneuvojen painon (wt) ja kulutuksen (mpg) eli kahden jatkuvan muuttujan välinen suhde. Sen saa kuvattua pisteparvikuvaajana lisäämällä ggplot(aes()) -komentoon halutut muuttujat x- ja y-akseleille ja lisäämällä haluttu geometria (geom_point) seuraavalle riville. (Huom.! Esimerkeissä käytetään nyt dplyr -paketin toimintoa %>%, jota on opastettu artikkelissa R – Aineiston tarkastelu ja puhdistaminen). Alla oleva esimerkki tarkoittaa, että ggplot() -komennot suoritetaan mtcars -aineistossa. Vaihtoehtoinen merkintätapa olisi ggplot(data=mtcars, aes(x=wt, y=mpg)).)

library(tidyverse) # ggplot2 latautuu samalla
mtcars %>% # Valitaan aineisto
  ggplot(aes(x=wt, y=mpg)) + #muuttujat x- ja y-akseleille
  geom_point() + #valitaan geometria (geom)

Mikäli halutaan korostaa muuttujien välistä korrelaatiota, voimme lisätä kuvaan pisteiden keskiarvoa kuvaava suora kerroksella geom_smooth(). Suoran voi muuttaa lineaariseksi lisäämällä sulkeisiin komennon method="lm" (eli valittu metodi on lineaarinen malli), joka kuvastaa lineaarisen regression mukaista kulmakerrointa.

mtcars %>% 
  ggplot(aes(x=wt, y=mpg)) +
  geom_point() +
  geom_smooth(method="lm")

Jos tarkasteltavia muuttujia halutaan lisätä samaan kuvaajaan, on siihen useampia mahdollisia vaihtoehtoja. Useasti kuvassa esitettävien muuttujien välistä suhdetta tarkastellaan suhteessa johonkin kolmanteen muuttujaan. Esimerkiksi ajoneuvon painon (wt) ja kulutuksen (mpg) suhteen lisäksi saattaisi kiinnostaa, kuinka monta sylinteriä (cyl) näissä autoissa on. Eri sylinterimäärät voidaan korostaa eri keinoin pisteparvikuviossa. Muuttuja cyl voidaan tällöin lisätä geom_point() -komennon sisään uutena aes() -funktion määritteenä, ja komennoksi voidaan ottaa esimerkiksi väri (color), muoto (shape), koko (size) tai läpinäkyvyys (alpha).

Huomaathan, että muuttuja cyl saa vain arvoja 4, 6 tai 8, joten se kannattaa muuttaa faktori- eli luokkamuuttujaksi ennen visualisointia, koska muuten muuttuja tulkitaan jatkuvaksi, jolloin myös väri-, muoto- ja kokoskaalat olisivat jatkuvia eli suhteellisia.

mtcars %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=wt, y=mpg)) + 
  geom_point(aes(color=cyl,
                 shape=cyl,
                 size=cyl))

Jos haluaisimme kuvata ryhmää cyl pisteiden muodolla ja toisaalta kuvaa elävöittääksemme määrittää kaikille pisteille yhteisen värin, tulee määrite color funktion aes() ulkopuolelle:

mtcars %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=wt, y=mpg)) + 
  geom_point(aes(size=cyl), color="blue")

Jos ryhmittelevä muuttuja on määritetty värin perusteella (geom_point(aes(color=muuttuja)), ja haluaisimme muuttaa, minkä värisiä eri ryhmistä tulisi, täytyy värit määritellä skaalojen avulla. Tätä käsitellään tarkemmin Skaalat-osiossa.

Pylväsdiagrammi (geom_histogram() / geom_col() / geom_bar())

Pylväsdiagrammi on hyvä valinta, jos tutkitaan havaintojen kokonaismääriä. Jos halutaan puolestaan tutkia yhden jatkuvan muuttujan jakaumaa, oikea valinta on jakaumakuvio eli histogrammi – geom_histogram(). Jos puolestaan kyseessä on yksi kategorinen muuttuja, saadaan eri kategorioiden summa käyttämällä geometriaa geom_bar(). Jos taas x-muuttuja on kategorinen ja y-muuttuja on jatkuva, on valinta geom_col().

Esimerkkinä on histogrammi muuttujan mpg jakaumasta. Kuvaaja saadaan valitsemalla geometriaksi histogrammi: geom_histogram(). Kuva saadaan näkyviin pelkällä geom-kerroksella, mutta voimme valita palkkien leveyden käyttämällä komentoa binwidth:

mtcars %>% 
  ggplot(aes(x=mpg)) + 
  geom_histogram(binwidth = 0.5)

Jos haluamme tarkastella kuinka paljon aineistossa on autoja, joissa on automaattivaihteisto (am = 1) sekä autoja, joissa on manuaalivaihteisto (am=0), valitsemme x-akselille muuttujan am ja geometriaksi geom_bar():

mtcars %>% 
  ggplot(aes(x=am)) + 
  geom_bar() 

Jos taas haluamme tutkia kuinka paljon koko aineiston kaikki automaatti- ja manuaalivaihteistoiset autot painavat yhteensä, valitaan x-akselille vaihteisto (am), y-akselille paino (wt), ja geometriaksi geom_col(). geom_col() laskee automaattisesti muuttujan wt summan molemmissa ryhmissä:

mtcars %>% 
  ggplot(aes(x=am, y=wt)) + 
  geom_col() 

Jos määriä halutaan tarkastella useammassa ryhmässä, voidaan valita kolmanneksi muuttujaksi esimerkiksi moottorin tyyppi (vs=1, V-moottori; vs=0, suora moottori), ja laittaa se geom_col() -kerroksen sisälle funktioon aes() ja määritellä palkkien täyttö (fill) sen mukaan: geom_col(aes(fill=vs)). geom_col asettaa automaattisesti eri väriset palkit päällekkäin (position="stack"). Jos pylväät halutaan siirtää vierekkäisiksi, voidaan komento position vaihtaa arvoon "dodge" (“väistää”):

mtcars %>% 
  mutate(vs=as.factor(vs)) %>% 
  ggplot(aes(x=am, y=wt)) + 
  geom_col(aes(fill=vs), position="dodge") 

Viivakuvaaja (geom_line)

Viivakuvaaja on asianmukainen valinta, jos halutaan tarkastella jatkuvaa muuttujaa tai siitä saatua laskennallista muuttujaa kategorisen muuttujan suhteen (esim. keskiarvo tai ilmaantuvuus). Esimerkiksi tietyn muuttujan vuosittainen muutos tai kehitys on tyypillinen tilanne, jossa viivakuvaaja on paras valinta. Koska mtcars -esimerkkidatassa ei ole juuri toimivia vaihtoehtoja viivakuvaajalle, käytämme tässä esimerkissä artikkelissa R – Tidy data -artikkelissa putsattua Tilastokeskuksen väestödataa.

Aineisto on jo asiallisesti muutettu ns. long-formaattiin, joten se saadaan helposti muutettua kuvaksi. Koska aineisto koostuu kahden eri ryhmän arvoista (Sukupuoli), tulee nyt määritellä ggplot() -rivin aes() -komentoon ryhmäksi sukupuoli (group=Sukupuoli). Lisäksi geom-riville valitaan, miten sukupuoli halutaan kuvassa erotella. Samoin kuin pisteparvikuvaajan esimerkissä, vaihtoehtoja on monta, kuten mm. väri (color), koko (size), muoto (shape) tai viivan tyyli (linetype). Alla olevassa esimerkissä erottelu on tehty värin ja viivatyypin perusteella, mutta erottelun voi tehdä myös vain yhdellä tavalla. Kuvan luettavuuden vuoksi y-akseli on muutettu alkamaan arvosta 0, käyttäen skaalausta. Skaalausta käsitellään myöhemmin tulevassa Skaalat -osiossa tarkemmin.

data %>% 
  mutate(Vuosi=as.factor(Vuosi),
         Keskiväkiluku=as.numeric(Keskiväkiluku)) %>% 
  ggplot(aes(x=Vuosi, y=Keskiväkiluku, group=Sukupuoli)) + 
  geom_line(aes(color=Sukupuoli, 
                linetype=Sukupuoli)) +
  scale_y_continuous(limits=c(0,2800000), 
                     breaks = seq(from=0, to=2800000, by=500000))

Laatikko-janakuvio (geom_boxplot())

Jos haluamme tarkastella jatkuvan muuttujan mediaania sekä ala- ja yläkvartaaleita, valitaan geom_boxplot(), eli laatikko-janakuvio. Esimerkiksi kulutuksen (mpg) mediaania ja hajontaa sylinterien määrän mukaan ryhmiteltynä voidaan tarkastella lisäämällä x- ja y-muuttujat ggplot(aes()) -kerrokseen, ja ryhmittelevä muuttuja geom_boxplot() -kerrokseen:

mtcars %>% 
  ggplot(aes(x=cyl, y=mpg)) + 
  geom_boxplot(aes(group=cyl))

Kuten edellisissä esimerkeissä ryhmiä voidaan havainnollistaa entisestään lisäämällä ryhmittelevä muuttujaa cyl myös täytöksi (fill) tai viivatyypiksi (linetype), jolloin myös kuvan viereen tulee selitykset (eng. legend) eri ryhmille.

mtcars %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=cyl, y=mpg)) + 
  geom_boxplot(aes(group=cyl, fill=cyl, linetype=cyl))

Yhteenveto kuvaajatyypeistä

Tässä osassa käytiin yleiskatsaus yleisimpiin kuvaajatyyppeihin ja niiden ominaisuuksiin. Kun kuvaaja on saatu näkyviin, on muuttujien ja ryhmien vaihtaminen helpompaa ja se kannattaa tehdä ennen muiden kerrosten, kuten skaalojen tai teemojen lisäämistä. Seuraavaksi uppoudutaankin kuvien tarkempaan viimeistelyyn. Koska loppuartikkelissa käsiteltävät asiat pätevät kuvaajatyypistä huolimatta samalla tavalla, esimerkeissä käytetään vain yhtä kuvaajatyyppiä.

Skaalat

Skaalat (eng. scale) ovat johdonmukainen ja selkeä tapa muuttaa kuvassa olevia akseleita (scale_x_*()), värejä (scale_color_*()), täytön väriä (scale_fill_*()), läpinäkyvyyttä (scale_alpha_*()) , viivojen tyyliä (scale_linetype_*()) ja muotoja (scale_shape_*()).

Esimerkkinä edellisessä kuvassa x- ja y- akseli eivät ala nollasta, sillä ggplot2 pyrkii rajaamaan kuvan niin, että vain havaintoarvot tulevat kuvan sisälle. Useasti kuva kuitenkin olisi realistisempi, jos sen akselit alkaisivat nollasta. Akseleiden skaalaukseen on tarjolla useita skaalausfunktioita eri tilanteisiin. Kategorinen akseli voidaan skaalata funktiolla scale_x_discrete(), se voidaan muuttaa päivämääräksi scale_x_date():lla tai muuttaa logaritmiseksi scale_x_log10():llä. Esimerkin tilanteessa akselit voidaankin korjata funktiolla scale_x_continous() (eli skaalaa x-akseli jatkuvana), sillä molemmat akselit ovat jatkuvia. Kyseinen funktio vaatii komennot limits (eli rajat) sekä breaks (eli välit), joiden avulla saadaan rajattua kuvan alue, sekä määritettyä mille väleille kuvan taustassa olevat viivat tulevat näkyviin. breaks -osaa kirjoittessa kannattaa hyödyntää seq() (sequence generator) -funktiota, joka luo vektorin halutuilla rajoilla ja väleillä.

Esimerkkinä tehdään ensimmäisen pisteparvikuvaesimerkki uudelleen niin, että x- ja y-akselit alkavat 0:sta (from=0) ja x-akseli rajautuu arvoon 6 (to=6) ja y arvoon 35 (to=35). x-akselin välit laitetaan näkymään 1 yksikön välein (by=1) ja y-akseli 5 yksikön välein (by=5).

mtcars %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=wt, y=mpg)) + 
  geom_point(aes(size=cyl)) +
  scale_x_continuous(limits=c(0,6), 
                     breaks = seq(from=0, to=6, by=1)) + 
  scale_y_continuous(limits=c(0,35), 
                     breaks = seq(from=0, to=35, by=5))

Samalla logiikalla voimme skaalata mm. värejä. Väreille on useita skaalausmahdollisuuksia, joista yksittäisille väreille on helpoin scale_color_manual() eli värin skaalaus manuaalisesti. Voimme muuttaa värin mukaan ryhmiteltyyn (aes(color=*)) pisteparvikuvaajaan pallojen värin haluttuun väriin valitsemalla se Googlen hex color-työkalulla.

Esimerkkinä väreillä ryhmitelty kuva edeltä, jossa pallot muutettuna valittuihin väreihin (#1862d9, #56db99 ja #8f1d37)

mtcars %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=wt, y=mpg)) + 
  geom_point(aes(color=cyl)) +
  scale_color_manual(values=c("#1862d9",  "#56db99", "#8f1d37"))

Jos kuvassa käytetään useampia värejä, voi niiden käsin valitseminen olla työlästä, ja tämän vuoksi ggplot2 sisältää vaihtoehtoja valmiiseen värimaailmaan, kuten scale_color_brewer(). Kyseisen funktion käyttöön on luotu värien valintaaa helpottava työkalu, mutta valmiit valikoimat löytyvät esim. Googlen kuvahausta: RColorBrewer palettes.

Esimerkkinä edellinen kuva, johon valittu paletti “Set1”:

mtcars %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=wt, y=mpg)) + 
  geom_point(aes(color=cyl)) +
  scale_color_brewer(palette="Set1")

Fasetointi

Jos haluaa tarkastella yli kolmea muuttujaa useammassa alaryhmässä (x, y, ja color/shape/size), kuva usein muuttuu sekavaksi. Tämän vuoksi ggplot2 sisältää erittäin käyttökelpoisen ominaisuuden nimeltä fasetointi (eng. faceting).

Fasetointi, eli kerrostaminen sallii saman kuvan monistamisen niin, että peräkkäisiin kuviin tulee näkyviin samat muuttujat useammasta alaryhmästä. Esimerkiksi muuttujan tarkastelu useampana eri vuotena voi olla järkevää tehdä fasetoidusti.

Otetaan esimerkiksi edellä esitelty ajoneuvon painon (wt) ja kulutuksen (mpg) suhde ryhmiteltynä sylinterien määrän (cyl) mukaan. Jos haluamme vielä nähdä onko näissä autoissa automaatti vai manuaalivaihteisto (am), lisäätään uusi kerros, johon tulee komento facet_grid(). Funktioon syötetään haluttu muuttuja, jonka mukaan uusi ryhmittely tehdään. Jos halutaan kuvat päällekkäin, laitetaan valittu muuttuja ennen aaltoviivaa ja sen jälkeen tulevaa pistettä (am ~ .) ja jos kuvat halutaan peräkkäin laitetaan komennot päinvastaisessa järjestyksessä (. ~ am)

mtcars %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=wt, y=mpg)) + 
  geom_point(aes(color=cyl)) + 
  facet_grid(am ~ .)
mtcars %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=wt, y=mpg)) + 
  geom_point(aes(color=cyl)) + 
  facet_grid(.~ am)

Varsinkin aineistoon perehtyessä on tärkeää saada nopeasti havainnollistettua erilaisia jakaumia ja muuttujien välisiä yhteyksiä. Tällöin facet_grid() kerrokseen voidaan lisätä kaksi muuttujaaa jotka muodostavat ruudukon (eng. grid) kuvista. Esimerkiksi, jos vielä edeltävään esimerkkiin halutaan mukaan vaihteiden määrä, se voidaan lisätä facet_grid() kerroksen komenttiin pisteen tilalle (am ~ gear).

mtcars %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=wt, y=mpg)) + 
  geom_point(aes(color=cyl)) + 
  facet_grid(am ~ gear)

Facetoidussa kuvassa on usein turhan paljon visualisoituna julkaisun kannalta, mutta se on tehokas tapa tutustua muuttujiin ja niiden jakaumiin tehokkaasti.

Teemat

Nyt kun kuvat on saatu näkymään, on syytä miettiä miten niistä saa julkaisukelpoisia. (Toim. huom.! ggplot2:n perusteeman jättäminen julkaisuun asti on merkki siitä, että kuvan tekijä on aloittelija, ja sitä kannattaa tietysti välttää.) ggplot2 tarjoaa laajan kokoelman valmiita teemoja, joihin voi itse tehdä lisäyksiä, tai vaikka luoda kokonaan omaan. Perusperiaate teemoissa on, että aivan jokaista kuvaajassa olevaa objektia voi muuttaa kunhan perehtyy määrittelytapoihin riittävästi.

Valmiit teemat

ggplot2:n valmiita teemoja on runsaasti, ja kannattaa kokeilla useampia jotta löytää omaaa silmää miellyttävän vaihtoehdon. ggthemes – paketti sisältää suuren määrän erilaisia teema- ja värivaihtoehtoja. Teemoja voi tarkastella esimerkiksi täältä.

Teeman lisääminen kuvaan on yhtä yksinkertaista kuin muidenkin kerrosten lisääminen. Edellisen esimerkin kuvaan saadaan hieman vaaleampi sävy käyttämällä esim. teemaa theme_bw(), joka lisätään koodiin omalle rivilleen:

mtcars %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=wt, y=mpg)) + 
  geom_point(aes(color=cyl)) + 
  facet_grid(am ~ .)  +
  theme_bw()

Teemojen muokkaaminen

Valmiita teemoja voi käyttää sellaisenaan, tai muokata oman toiveen mukaisesti. Kerroksella theme() voidaan valita käytännössä mikä tahansa komponentti (eng. component eli viivat, laatikot, numerot ja kirjaimet) ja muuttaa se sellaiseksi kuin haluaa. Jokainen kuvassa näkyvä komponentti on nimetty, ja lista komponenttien nimistä löytyy esimerkiksi tidyversen verkkosivulta. Toisinaan oikean komponentin valinta onnistuu vasta ankaran googlauksen, yrityksen ja erehdyksen kautta. Lisäksi muokatessa joutuu miettimään mikä elementti (eng. element) kyseinen komponentti on. Valittu komponentti määritellään funktiolla element_*, ja komponentin laatu vaikuttaa siihen, mikä element_* -funktiosta valitaan. Tekstiä muuttaessa valitaan siis element_text(), viivoja muokatessa element_line(), laatikoita muokatessa element_rect() (eng. rectangle eli suorakaide) ja niin edelleen.

Eli suomeksi: jos halutaan muuttaa tekstiä, valitaan komponentti text ja sille elementiksi teksti eli element_text. Tämän jälkeen luodaan theme() funktion sisälle komento, jossa on komponentti sekä elementti, ja näille haluttu koko, väri ja muut ominaisuudet. Esimerkiksi fonttikoko 10 ja punainen teksti saadaan komennolla theme(text=element_text(size=10, color="red")). Jos haluaisimme muokata vain x- akselin tekstiä, valittu komponentti olisi puolestaan axis.text.x. Jos muokattava komponentti on viiva (eng. line), valitaan komponentti line ja sille elementti element_line. Eli kuvan kaikki viivat saadaan kokoon 2 ja siniseksi koodilla theme(line=element_line(color="blue", size=2)). Myös muiden komponenttien muokkaaminen toimii vastaavalla toimintalogiikalla. Koska komponenttien nimet ovat osittain epäloogisia, niitä joutuu terminologiaa usein googlaamaaan ja tarkistamaan ennen käyttöä.

Otetaan nyt edellinen kuva käsittelyyn. Jos haluaisimme julkaista kuvan, ainakin kaikkien tekstien kokoa tulisi muuttaa suuremmaksi, sekä facetoinnista johtuvat harmaat palkit muuttaa valkoiseksi. Ensiksi etsitään oikeat komponentit ja niiden elementit. text -komponentti muuttaa kaikkia kuvan tekstejä, joten sitä voidaan hyödyntää tässä. Koska nyt muutamme tekstiä, valitaan element_text(), ja funktion sisään komennoksi tulee size=16. Näin kaikki kuvan tekstit muuttuu kokoon 16.

Harmaiden palkkien komponentin valinta onkin hieman haastavampaa, mutta pienen etsinnän jälkeen selviää, että strip.background – komponentti on oikea valinta. Koska kyseessä on laatikko, valittu elementti on tietysti element_rectangle, ja siihen määritelty komento on fill="white" (eng. täyttö).

mtcars %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=wt, y=mpg)) + 
  geom_point(aes(color=cyl)) + 
  facet_grid(am ~.)  +
  theme_bw() + 
  theme(text = element_text(size=16),
        strip.background = element_rect(fill="white"))

Nyt kuva on jo selvästi luettavampi, mutta tekstit ovat edelleen muuttujien niminä, ja ne muutetaan seuraavaksi. Kuvassa olevia muuttujien nimiä voidaan muokata kerroksella labs() (eng. labels eli nimike). Funktioon valitaan halutut nimikkeet ja määritellään niille kuvaavammat nimet. Koska kuvassa näkyvät nimet tulevat suoraan aineiston muuttujien nimistä, saadaan oikea teksti määriteltyä sen mukaan miten muuttuja on ggplot(aes()) funktiossa määritelty. Esim x-akselin nimi voidaan muuttaa komennolla x="Weight (1000 lbs)", ja kuvassa pallojen väriä kuvastava muuttuja cyl muutetaan valitsemalla color="Number of cylinders".

mtcars %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=wt, y=mpg)) + 
  geom_point(aes(color=cyl)) + 
  facet_grid(am ~.)  +
  theme_bw() + 
  theme(text = element_text(size=16),
        strip.background = element_rect(fill="white")) +
  labs(y="Miles/(US) gallon",
       x="Weight (1000 lbs)",
       color="Number of cylinders")

Kuva alkaa olemaan jo lähellä julkaisukelpoisuutta, mutta vielä pitää tehdä muutamaa muutos. Nyt color -komponentin nimi on niin pitkä, että se vie tilaa kuvalta, ja kuva saataisiin siistimmäksi siirtämällä kyseinen komponentti kuvan alle. Se onnistuu lisäämällä teemaan selitteen (eng. legend) sijainti (eng. position), eli legend.position = "bottom". Toinen vaihtoehto on rivittää otsikko. Se tapahtuu käyttämällä \n -merkkijonoa (color="Number \n of cylinders"). Huomaa, että kyseessä on kenoviiva, ei kauttaviiva.

Lopuksi ongelmana on enää facetoinnista johtuvat nimet 1 ja 0, jotka tulevat muuttujasta am, eli vaihteisto (0 = automatic, 1 = manual). Koska nyt kyseessä ei ole muuttujien nimet vaan arvot, tulee nimet korjata alkuperäiseen aineistoon ennen kuvan koodia. Käytetään funktiota mutate() sekä recode(), joilla 0 muutetaan arvoon “Automatic” ja 1 arvoon “Manual”.

mtcars %>% 
  mutate(am = recode(am, 
                     `1`="Manual",
                     `0`="Automatic")) %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=wt, y=mpg)) + 
  geom_point(aes(color=cyl)) + 
  facet_grid(am ~.)  +
  theme_bw() + 
  theme(text = element_text(size=16),
        strip.background = element_rect(fill="white"),
        legend.position = "bottom") +
  labs(y="Miles/(US) gallon",
       x="Weight (1000 lbs)",
       color="Number of cylinders")

Nyt lopputuloksena on alkutilanteeseen nähden informatiivisempi ja siistimpi kokonaisuus, joka sisältää viiden eri muuttujan informaation, ilman että kuva on erityisen sekava. Vaikka nyt voi tuntua, että teemaan muuttaminen vaatii paljon työtä ja yksityiskohtien hieromista, yleensä riittää että sen tekee kerran, ja jatkossa kopioi teemaan liittyvät rivit ja siirtää ne suoraan seuraavaan kuvaan. Tämä on yksi syy muiden ohella, miksi ggplot2 on tehokas tapa datan visualisoinnissa.

Kuvan tallentaminen

RStudio sisältää suoraan useamman vaihtoehdon kuvien tallentamiseen.

Plot-ruudun yläreunassa on valikko Export, josta kuvan voi tallentaa yleisimmissä kuvaformaateissa, PDF:nä, tai kopioida sen leikepöydälle. Nämä ovat tietysti varteenotettavia vaihtoehtoja, mutta tällöin kuvan koko ja formaatti tulee määritellä käsin joka kerta erikseen. Yleensä kuitenkin tutkimusta tehdessä kuvia on useita, ja niitä muutetaan jatkuvasti muun tutkimusryhmän kommenttien perusteella. Tällöin koodin avulla kuvan tallentaminen on tehokkainta. Siihenkin on useita vaihtoetoja, joista yksi käyttökelpoinen tapa on yleisimpien kuvaformaattien mukaan nimetyt funktiot. Esim .png -formaatissa kuva saadaan tallennettua png() -funktiolla, johon määritellään kuvan nimi, koon yksikkö (units), leveys (width), korkeus (height) ja resoluutio (res). Funktion jälkeen tulee kuvan koodi, ja tallennus loppuu komentoon dev.off()

png("Kuvan nimi.png", units="in", width=8, height=6, res=300)
mtcars %>% 
  mutate(am = recode(am, 
                     `1`="Manual",
                     `0`="Automatic")) %>% 
  mutate(cyl=as.factor(cyl)) %>% 
  ggplot(aes(x=wt, y=mpg)) + 
  geom_point(aes(color=cyl)) + 
  facet_grid(am ~.)  +
  theme_bw() + 
  theme(text = element_text(size=16),
        strip.background = element_rect(fill="white"),
        legend.position = "bottom") +
  labs(y="Miles/(US) gallon",
       x="Weight (1000 lbs)",
       color="Number of cylinders")
dev.off()

Tällä koodilla kuva tallentuu automaaattisesti koodin ajaamisen yhteydessä projektikansioon nimellä Kuvan nimi.png. Funktio toimii samalla periaatteella ainakin .jpeg, .png ja .tiff -formaattien kanssa, joita lehdet yleensä kelpuuttavat.

Yhteenveto

Tässä artikkelissa esiteltiin esimerkki siitä, kuinka ggplot2 -paketilla luodaan kuva alusta asti aina julkaisukelpoiseksi saakka. Vaikka paketin käyttö voi alussa tuntua monimutkaiselta, on siinä kuitenkin hyvin looginen toimintaperiaate, ja erittäin laajat mahdollisuudet kuvien viimeistelyyn. Esimerkeissä käytiin kuvan luominen pääpiirteissään, ja jokaisen käytetyn funktion käytöstä löytyy laajasti lisäinformaatiota englanniksi esimerkiksi Googlen avulla.

Yhteenvetona:

mtcars %>%
  ggplot(aes(x=wt, y=mpg)) + # Aloita ggplot() + aes()
  geom_point(aes(color=cyl)) + # Valitse geometria
  facet_grid(am ~.) + # Valitse facetointi tai ilman
  theme_bw() + # Valitse teema ja muokkaa sitä
  theme(text = element_text(size=16)) + # Komponentti + Elementti
  labs(y="Miles/(US) gallon", # Nimeä muuttujat 
       x="Weight (1000 lbs)",
       color="Number of cylinders")

Lisää luettavaa (ei sidonnaisuuksia):

Kirjoittanut Ville Ponkilainen, vertaisarvioinut Mikko Uimonen ja Aleksi Reito.

Mitä mieltä olit artikkelin sisällöstä?

Klikkaa tähteä arvostellaksi artikkelin!

Keskiarvo 5 / 5. Arvostelujen lukumäärä: 1

Kukaan ei ole vielä äänestänyt, ole ensimmäinen

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *