Základné grafické príkazy

V základnej R grafike potrebujeme najskôr vytvoriť ‘prázdny’ graf a definovať jeho parametre. Väčšina grafických príkazov ale urobí túto prácu za nás, preto nasledujúci kód považujte za príručku, čo robiť, keď automatické nastavenie chcete zmeniť.

plot.new()
plot.window(xlim = c(0, 10),ylim = c(-2, 4), xaxs = "i")
box()
axis(1, col.axis = "grey30")
axis(2, col.axis = "grey30",las = 1)
title(main = "nazov grafu",col.main = "green4",sub = "popis",col.sub = "green4",xlab = "os x", ylab = "os y",col.lab = "blue", font.lab = 3)
box("figure", col = "grey90")

Pre jednoduché dáta môžeme vyresliť napríklad čiarový graf (line graph). Uvažujme dáta udávajúce výnosy formi za roky 2005-2015:

x = 2005:2015
y = c(81.1, 83.1, 84.3, 85.2, 85.4, 86.5,88.3, 88.6, 90.8, 91.1, 91.3)
plot.new()
plot.window(xlim = range(x),ylim = range(y))
lines(x, y, lwd = 2, type="l", col="yellow") #type:l,s,S,h,p,b,o
title(main = "Vynosy za obdobie 2005-2015", xlab = "rok", ylab = "vynos")
axis(1)
axis(2)
box()

Všimnime si ale, že predchádzajúci kód vieme vygenerovať aj oveľa jednoduchšie tak, že necháme R, nech aitomaticky nastaví grafické parammetre:

plot(x, y, type="l", lwd=2, main="Vynosy za obdobie 2005-2015", xlab = "rok", ylab = "vynos")

Ďalej uvidíme, že príkaz plot je veľmi univerzálny a snaží sa automaticky zvoliť najvhodnejší graf podľa toho, aký vstup mu dáme.

Parameter `type’ udáva typ grafu, ktorý chceme vykresliť: vyskúšajte si predchádzajúci riadok spustiť s typmi “s”, “S”, “h”, “p”, “b”, “o”.

Čiarové grafy môžeme využiť napríklad pri lineárnej regresii. Vygenerujme 500 bodov zo štandardizovaného normálneho rozdelenia x a do y uložme tie isté body s tým, že ku každému pripočítame ešte ďalšie náhodné číslo. Pomocou príkazu lm môžeme teraz fitovať model \(y=\alpha+\beta x+\varepsilon(x)\) a vykresliť priamku lineárnej regresie.

x = rnorm(500)
y = x + rnorm(500)
z = lm(y ~ x)
plot(x, y, pch=16, col="lightblue")
abline(a = coef(z)[1], b = coef(z)[2], col="magenta", lwd=2)

Tu sme použili príkaz abline, ktorý vykreslí priamku s priesečníkom a so sklonom b. Ďalej si všimnime, že pri vykreslení bodiek sme použili parameter pch, ktorý nám umožňuje meniť typ bodky. Všetky možnosti môžete nájsť napríklad na http://www.sthda.com/english/wiki/r-plot-pch-symbols-the-different-point-shapes-available-in-r

Ďalším jednoduchým grafom je koláčový graf, na ktorý máme k dispozícii príkaz pie.

meat = c(8, 10, 16, 25, 41)
names(meat) = c("Lamb","Mutton","Pigmeat","Poultry","Beef")
pie(meat,main = "New Zealand Meat Consumption",cex.main = 2)

Grafy funkcií môžeme vykresliť rôznymi spôsobmi. Už by sme si vedeli poradiť aj s tým , čo poznáme: ak máme nejakú funkciu a chceme ju vykresliť napríklad na intervale (0,5), môžeme vytvoriť vektor x, do ktorého uložíme dostanete najemno diskretizovaný interval (0,5) a do vektora y uložíme hodnoty danej funkcie:

g <- function(t) { return (t^2+1)^0.5 } 
x <- seq(0,5,length=10000) 
y <- g(x) 
plot(x,y,type="l")

Oveľa pohodlnejšie ale je použiť buď príkaz curve alebo do funkcie plot dať ako prvý argument priamo funkciu f:

curve((x^2+1)^0.5,0,5)
curve((x^2+2)^0.5,0,5,add=TRUE,col="blue")

f <- function(x) return((x^2+1)^0.5)
plot(f,0,5)

Trojrozmerná grafika

Ak chceme v R kresliť trojrozmerné obrázky, potrebujeme použiť niektorú z knižníc, ktoré to umožňujú. Ukážeme si dve z nich.

Uvažujme funkciu \(z=f(x,y)=x^2+xy\) a vykreslime ju na množine \([1,10]\times[1,15]\). Pomocou expand.grid vytvoríme mriežku a do objektu z vo výstupe z tejto funkcie uložíme hodnoty funkcie. Na samotné vykreslenie použijeme príkaz wireframe:

library(lattice)
a <- 1:10
b <- 1:15
eg <- expand.grid(x=a, y=b)
eg$z <- eg$x^2 + eg$x * eg$y
wireframe(z ~ x+y, eg)

wireframe(z ~ x+y, eg, shade = TRUE)

Krajšie, rotovateľné obrázky môžeme vytvoriť pomocou knižnice rgl.

X <- Y <-  seq(-2, 0, length.out= 20)
Z <- outer(X, Y, function(X,Y) 2/exp((X-.5)^2+Y^2)-2/exp((X+.5)^2+Y^2))

Nasledujúce riadky sú len technická pomôcka na vykreslenie farebného obrázku.

cc <- colorRamp(rev(rainbow(10)))
Zsc <- (Z-min(Z))/diff(range(Z))
rgbvec2col <- function(x) do.call(rgb,c(as.list(x),list(max=255)))
colvec <- apply(cc(Zsc), 1, rgbvec2col)

Samotnú funkciu vykreslíme pomocou surface3d

library(rgl)
surface3d(X, Y, Z, col=colvec)
axes3d()

You must enable Javascript to view this page properly.

Vyskúšajte si obrázok pomocou myši rotovať a kolieskom zväčovať/zmenšovať.

Knižnica rgl je veľmi obsiahla a podrobnejší návod na jej použitie spolu s príkladmi môžete nájsť na http://www.sthda.com/english/wiki/a-complete-guide-to-3d-visualization-device-system-in-r-r-software-and-data-visualization

Krajšia grafika: ggplot

Na základnú grafiku v R sa v poslednom čase čoraz častejšie používa knižnica ggplot2. Jej výhodou je, že výstupy z nej sú krajšie aj bez zmien automatických nastavení a mnoho náročnejších vizualizácií sa v nej dá urobiť oveľa jednoduchšie.

#install.packages("ggplot2")
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.6.3

Načítanie dát

Použijeme dáta z the National Morbidity and Mortality Air Pollution Study (NMMAPS), z ktorých vyberieme údaje za Chicago v rokoch 1997-2000.

nmmaps <- read.csv("http://www.iam.fmph.uniba.sk/ospm/Filova/chicago-nmmaps.csv", as.is=TRUE)
nmmaps$date <- as.Date(nmmaps$date)
nmmaps <- nmmaps[nmmaps$date>as.Date("1996-12-31"), ]
nmmaps$year <- substring(nmmaps$date, 1, 4)
head(nmmaps)
##      city       date death temp dewpoint      pm10        o3 time season year
## 3654 chic 1997-01-01   137 36.0    37.50 13.052268  5.659256 3654 winter 1997
## 3655 chic 1997-01-02   123 45.0    47.25 41.948600  5.525417 3655 winter 1997
## 3656 chic 1997-01-03   127 40.0    38.00 27.041751  6.288548 3656 winter 1997
## 3657 chic 1997-01-04   146 51.5    45.50 25.072573  7.537758 3657 winter 1997
## 3658 chic 1997-01-05   102 27.0    11.25 15.343121 20.760798 3658 winter 1997
## 3659 chic 1997-01-06   127 17.0     5.75  9.364655 14.940874 3659 winter 1997

Základný graf

Na vytvorenie základného grafu v ggplot potrebujeme špecifikovať

  1. dáta, ktoré používame

  2. ktoré premenné chceme vykresliť (aes)

  3. ako ich chceme vykresliť (geom)

Výsledný graf môžeme uložiť ako objekt v R Workspace a následne ho modifikovať:

g <- ggplot(nmmaps, aes(date, temp)) + geom_point(color="firebrick")
g

Názov a popisky osí

Názov pridáme pomocou príkazu ggtitle. Vidíme ale, že font aj umiestnenie nám celkom nevyhovuje, preto môžeme parametre názvu modifikovať pomocou príkazu theme, v ktorom špecifikujeme, že chceme zmeniť plot.title.

g <- g + ggtitle('Teplota')
g + theme(plot.title = element_text(size=20, face="bold", margin = margin(10, 0, 10, 0)))

Názvy osí zmeníme pomocou labs

g <- g + labs(x="Date", y=expression(paste("Teplota ( ", degree ~ F, " )")), 
     title="Teplota")

Zmeniť veľkosť popisiek môžeme opäť pomocou theme:

g + theme(axis.text.x=element_text(angle=50, size=20, vjust=0.5))

Ďalšie modifikácie

Ohraničenie pre os y

g + ylim(c(0,60))
## Warning: Removed 550 rows containing missing values (geom_point).

Farebné odlíšenie vzhľadom na ročné obdobie dosiahneme tak, že do aes, kde zadávame, čo chceme vykresliť, pridáme argument color, ktorý bude mať hodnotu podľa ročného obdobia, ktoré špecifikujeme ako faktorovú premennú. Ďalej pridáme vedľa grafu legendu pomocou príkazu guides:

g <- ggplot(nmmaps, aes(date, temp, color=factor(season))) + 
   geom_point()
g + guides(colour = guide_legend(override.aes = list(size=4)))

Podobne ako geom_point vykresľuje body, pomocou geom_line môžeme vykresliť spojnice dátových bodov:

ggplot(nmmaps, aes(x=date, y=o3)) + geom_line(color="grey") + 
   geom_point(color="red")

Parameter theme môžeme použiť napríklad aj na zmenu pozadia grafu:

ggplot(nmmaps, aes(date, temp)) + geom_point(color="firebrick") + 
      theme(panel.background = element_rect(fill = 'grey75'))

Viac grafov spolu do jedného obrázku vykreslíme pomocou facet_wrap:

ggplot(nmmaps, aes(date,temp)) + geom_point(color="aquamarine4") + 
       facet_wrap(~year, nrow=1)

ggplot(nmmaps, aes(date,temp)) + geom_point(color="chartreuse4") + 
       facet_wrap(~year, ncol=2)

Pomocou stat_smooth pridáme krivku vyhladzujúcu dáta:

ggplot(nmmaps, aes(date, temp))+geom_point(color="firebrick")+
  stat_smooth()
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

Iné typy grafov

Boxplot

Na vykreslenie boxplotu si najskôr do objektu g uložíme, že budeme pracovať s premennými season (ročné obdobie) a o3 (ozón). Samotný boxplot potom vygenerujeme jednoducho pomocou geom_boxplot:

g <- ggplot(nmmaps, aes(x=season, y=o3))
g + geom_boxplot(fill="blue")

Jitter plot

g + geom_jitter(alpha=0.5, aes(color=season),position = position_jitter(width = .2))

Violin plot

g + geom_violin(alpha=0.5, color="red")

Všimnime si, ako jednoducho vieme otočiť graf o 90 stup?ov:

g + geom_violin(alpha=0.5, color="red") + coord_flip()

Priamka lineárnej regresie

Pomocou už spomínaného príkazu stat_smooth vieme do grafu pridať priamku lineárnej regresie:

ggplot(nmmaps, aes(temp, death)) + geom_point(color="blue") + 
  stat_smooth(method="lm", se=TRUE, color="green")
## `geom_smooth()` using formula 'y ~ x'

Zdroje

  1. Prehľad príkazov možno nájsť na [https://www.rstudio.com/wp-content/uploads/2015/03/ggplot2-cheatsheet.pdf]

  2. Podrobná referenčná príručka je na [https://ggplot2.tidyverse.org/reference/]

  3. Tento ggplot tutorial je spracovaný podľa http://zevross.com/blog/2014/08/04/beautiful-plotting-in-r-a-ggplot2-cheatsheet-3/