Autor článku: Lenka Fiřtová

V tomto článku si ukážeme, jak vytvořit hezký bodový graf s balíčkem ggplot2. Budeme pracovat s datasetem trees, který je v R volně k dispozici. Dataset obsahuje údaje o průměru, výšce a objemu dřeva 31 různých stromů (sloupce Girth, Height, Volume; pozn: Girth sice v angličtině neznamená průměr, nicméně dataset skutečně obsahuje údaje o průměru).

Balíček ggplot2

Balíček ggplot2 je nejkomplexnější balíček na vytváření grafů, který byl pro R dosud vytvořen. Umožňuje vytvářet širokou paletu grafů, od bodových, přes histogramy, po grafické zobrazení korelací a mnohé další. V R lze sice vytvořit grafy i bez tohoto balíčku, avšak balíček ggplot2 umožňuje získat mnohem hezčí grafy, a to s minimem úsilí.

Před prvním použitím si musíme tento balíček nainstalovat příkazem install.packages a následně načíst příkazem library. Při každém dalším použití tohoto balíčku už stačí použít pouze příkaz library.

> install.packages("ggplot2")
> library(ggplot2)

Před použitím datasetu trees si upravíme veličiny Girth a Height, aby byly v měrných jednotkách, na které jsme zvyklí. V původním datasetu je totiž průměr uveden v palcích a výška ve stopách. Převedeme je na centimetry a metry, a to následujícím způsobem:

> trees$Height = 0.3 * trees$Height
> trees$Girth = 2.54 * trees$Girth

V tomto článku se budeme zabývat bodovými grafy; další funkce balíčku ggplot2 (např. dělení grafů do vícero podgrafů) najdete například v článku o histogramech.

Základní bodový graf

Prvním krokem při tvorbě grafu v balíčku ggplot2 je příprava podkladu. To znamená, že řekneme Rku, jaké veličiny má budoucí graf zobrazovat. Podklad nazveme muj_graf.

> muj_graf = ggplot(trees, aes(Height, Girth))

Konkrétně: uvedeným příkazem říkáme, že vytváříme proměnnou muj_graf, která bude obsahovat graf postavený na základě datasetu trees, přičemž na ose x bude výška (Height) a na ose y bude průměr (Girth). Jak vidíme, argument aes specifikuje, co bude na osách, a to v pořadí osa x, osa y.

Když si proměnnou muj_graf zobrazíme, uvidíme, že graf je prázdný.

> muj_graf

To proto, že jsme Rku ještě neřekli, jakým způsobem má data zobrazit. Jako body? Jako regresní přímku? Jinak?

My bychom chtěli data zobrazit pomocí bodů (tzn. vytvořit bodový graf). K podkladu muj_graf tedy přidáme příkaz geom_point(), čímž se do grafu dokreslí body.

> muj_graf + geom_point() 

Syntaxe balíčku ggplot2 funguje tak, že další prvky grafu přidáváme pomocí symbolu plus, zatímco stávající prvky grafu upřesňujeme v závorce.

Kdybychom tedy například chtěli přidat do grafu názvy os, a dále změnit barvu puntíků na fialovou (purple), bude příkaz vypadat následovně:    

> muj_graf + geom_point(colour = "purple") + xlab("Výška v m") + ylab("Průměr v cm")

Příkazy xlab a ylab nastavují popisek osy x a y, argument colour mění barvu bodů. Dostupných barev je v R celá škála, viz například: http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf.

Bodový graf s rozlišením podle kategorií

Balíček ggplot umožňuje snadno nastavit barvu nebo tvar bodů podle kategorií (například podle pohlaví, vzdělání apod.). Abychom si to mohli ukázat, přidejme do datasetu sloupec se (smyšleným) údajem o tom, zda jde o listnatý nebo jehličnatý strom. Příkazem sample tak, jak je napsán níže, vybereme 31krát jednu z možností „listnaty“, „jehlicnaty“ a těchto 31 údajů uložíme do proměnné typ.

> typ = sample(c("listnaty","jehlicnaty"), 31, replace = TRUE)

Příkazem as.factor přepneme proměnnou typ na kategoriální. To je důležité, protože R včetně balíčku ggplot2 pracuje s kategoriálními proměnnými poněkud odlišně než například s číselnými (podobněji viz https://exceltown.com/navody/jazyk-r/kategorialni-promenne-v-jazyce-r-factors/).

> typ = as.factor(typ)

Tuto proměnnou pak můžeme přilepit příkazem cbind k datasetu trees jako další sloupec.

> typ = cbind(trees, typ)

Nyní už snadno řekneme Rku, že má zobrazit body v různé barvě právě podle typu stromu, a to následovně:

> muj_graf + geom_point(aes(colour = typ))

Údaj, zda je strom jehličnatý nebo listnatý, byl vygenerován náhodně, proto se váš vlastní graf bude pochopitelně lišit.

Podobně bychom mohli rozlišovat podle typu stromu tvar bodů, nikoli jejich barvu:

> muj_graf + geom_point(aes(shape = typ))