R-KORNERI

Kuvioiden muokkaaminen ärrässä – case ggplot2

Mainio työväline kuvioiden piirtämiseen on R-ohjelmiston ggplot2 -paketti. Paketilla tehtyjen kuvioiden etu on erityisesti monipuolisuus ja muokattavuus.

Vuoden viimeisessä ärräkornerissa tutustutaan kuvioiden piirtämiseen ggplot2-paketin avulla. Kyseinen paketti on jälleen Haldey Wickhamin kehittämä ja osa Tidyverseä, ja sillä voi käytännössä korvata R:n omat kuvaajien piirtämiseen tarkoitetut funktiot. ggplot2:n sisäinen logiikka, “grammar of graphics”, perustuu Leiland Wilkinsonin samannimiseen kirjaan. Ajatus on luoda ensin graafille pohja, jonka jälkeen pohjan päälle lisätään erilaisia kerroksia. Ne sisältävät tiedon siitä millaisen kuvan ohjelmoija haluaa luoda.

ggplot2:n ensimmäinen rakennuspalikka on funktio ggplot(), jolle yleensä annetaan argumenteiksi vähintään kuvattava data. Käytän esimerkeissä ggplot2-pakettiin kuuluvaa mpg-dataa, joka sisältää kiinnostavia tietoja erilaisten autojen bensankulutuksesta. Yksinään ggplot(data = mpg) printtaa tyhjän kuvan, sillä ggplotille pitää kertoa vielä miten käyttäjä haluaa aineistoa kuvata. Tämä tehdään erilaisilla geom_x() funktioilla, jossa x:n tilalle laitetaan kuvaajan tyyppi, esimerkiksi geom_point() tai geom_histogram(). Vielä tarvitaan ns. aesthetic mapping eli data, joita haluamme kuvata erilaisilla geomeilla.

Seuraava koodi piirtää scatterplotin, jossa displ on auton moottorin koko ja hwy on polttoainetehokkuus moottoritiellä.

ggplot(data = mpg) + # plus-merkin pitää olla rivin lopussa
  geom_point(aes(x = displ, y = hwy))

aes() funktio kertoo että haluamme piirtää pisteet niin että x-akselilla on displ ja y-akselilla hwy. Tämän funktion voi määritellä myös ggplot():n sisällä, jolloin kaikki kuvaan lisätyt geomit piirretään käyttäen näitä x:lle ja y:lle annettuja arvoja.

Mielestäni yksi kätevimmistä ggplot:n ominaisuuksista on mahdollisuus määrittää joku kolmas datan sarake, jonka mukaan piirretyt havainnot ryhmitellään. Tämä onnistuu tosin vain, jos data on siistissä muodossa. Ryhmittelyn voi tehdä käyttämällä esimerkiksi värejä tai erilaisia muotoja. Värejä käyttäessä tulee huomioida värisokeat ja olla käyttämättä erityisesti punaista ja vihreää samassa kuvassa. Erilaisia väripaletteja on tarjolla lukuisia ja niiden käyttö on helppoa.

Alla aes():n sisällä määritellyt color ja shape käskevät ggplotia luokittelemaan pisteet värein ja muodoin, sen mukaan ovatko autot etu-, taka- vai nelivetoisia.

ggplot(data = mpg) +
  geom_point(aes(x = displ, y = hwy, color = drv, shape = drv)) +
  scale_color_viridis_d()   # viridis paketti muuttaa väriskaalan

ggplotin selkein etu perus R:ään verrattuna on kuvioiden helppo ja lähes rajaton muokattavuus. Muokkaaminen tapahtuu seuraavasti. Ensin määritellään perusosa eli jo tuttu ggplot(data = mpg) ja talletetaan sen muuttujaan, tässä tapauksessa gg_base-nimiseen. Toisessa vaiheessa kuvioita muokataan lisäämällä geomeita ja muita härpäkkeitä gg_base-objektin päälle. Härpäkkeet vastaavat käytännössä jutun alussa mainittuja kerroksia ja niitä käytetään seuraavaan tapaan.

require(ggthemes) # sisältää teeman economist

gg_base <- ggplot(data = mpg) # talletetaan muuttujaan gg_base

gg_base +
  geom_boxplot(aes(x = drv, y = displ)) +      # piirtää boxplotin
  geom_jitter(width = 0.2, aes(x = drv,
                              y = displ,
                              color = drv)) + # piirtää pisteet
  scale_color_economist() +                    # muuttaa väriskaalan
  ggtitle(”Etu-, taka- vai nelivetoinen ja moottorin koko”) + # otsikko
  labs(x = ”Etu-, taka- vai nelivetoinen”,
      y = ”Moottorin koko”,
      color = ”vetotapa”) +                   # nimeää akselit ja legendin
  theme_economist(10)               # theme_x muuttaa kuvion oletusasetuksia

Myös tämän härpäkkeillä varustetun ggplot-objetin voi tallentaa erilliseen muuttujaan. Tämä on kätevää tehtäessä useita hiukan erilaisia kuvia. Se myös vähentää koodin toisteisuutta. Härpäkkeitä lisäämällä kuviota on siis helppo muokata. Ohjeita erilaisten kuvioiden tekoon löytyy joko googlaamalla tai ggplotin Cheat Sheetistä.

ggplotin toinen vahvuus verrattuna R:n omiin funktioihin on, että se tarjoaa yhdenmukaisen syntaksin mitä erilaisimpien kuvien luomiseen. R:n omia funktioita käyttäessä jokaiselle kuviotyypille kuten historgrammille tai boxplotille on omat funktionsa. Eli kun toteat: ”äh, eihän tätä kannata histogrammilla kuvata vaan boxplotilla”, joudut koodaamaan koko syntaksin uudestaan. ggplotin tapauksessa kuviotyypin vaihto onnistuu helposti valitsemalla erilaisen geomin. Härpäkkeitä ei välttämättä tarvitse muokata laisinkaan. Lisäksi ggplotin tuottamat kuvioit ovat oletusasetuksilla, jonkin verran hienompia kuin perus R:n graafit. Kummankin peruskuvioiden kanssa joutuu kuitenkin tekemään melkoisesti töitä ennen kuin kuviot ovat julkaisukelpoisia.Tässä artikkelissa mainittujen ominaisuuksien lisäksi ggplotilla voi tehdä lähes mitä vain kartoista interaktiivisiin graafeihin. Hyviä lähteitä kiinnostuneelle ovat edellä vinkatun Cheat Sheetin lisäksi edellisissäkin kornereissa mainittu Garrett Grolemundin ja Hadley Wickhamin kirjoittama R for Data Science -kirja. Lisäksi internetistä löytyy lähes rajaton määrä ggplottiin liittyvää materiaalia.

TEKSTI: Tuomas Markkula


Jatka keskustelua: