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)
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
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
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
Na vytvorenie základného grafu v ggplot potrebujeme špecifikovať
dáta, ktoré používame
ktoré premenné chceme vykresliť (aes)
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 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))
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")'
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")
g + geom_jitter(alpha=0.5, aes(color=season),position = position_jitter(width = .2))
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()
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'
Prehľad príkazov možno nájsť na [https://www.rstudio.com/wp-content/uploads/2015/03/ggplot2-cheatsheet.pdf]
Podrobná referenčná príručka je na [https://ggplot2.tidyverse.org/reference/]
Tento ggplot
tutorial je spracovaný podľa http://zevross.com/blog/2014/08/04/beautiful-plotting-in-r-a-ggplot2-cheatsheet-3/