Příklady k procvičení
Budeme pracovat s datovou tabulkou states
> data(state)
> states <- data.frame(state.x77, state=row.names(state.x77), Region=state.region, Division = state.division, row.names=1:50)
1. Aplikujte funkci plot() obou typů zápisu (x,y) vs (x~y) na data states, a to jednak na dvě spojité proměnné (Income, Area, Population apod..), a jednak na dvojici kategoriální (Region) a některé spojité proměnné. Je důležitý typ zápisu x a y? Jaké grafy jste získali při kterých proměnných a zápisech?
Nejdříve vyzkoušíme dvě spojité proměnné:
> plot(x=states$Income, y=states$Area)
> plot(states$Income ~ states$Area)
Výsledkem jsou v obou zápisech bodové grafy, rozdíl je, že u zápisu funkčního dojde k prohození osy x a y.
Vyzkoušíme spojitou a kategoriální proměnnou:
> plot(x=states$Income, y=states$Region)
> plot(states$Region ~ states$Income)
U nefunkčního zápisu je znovu výsledkem bodový graf, ale u zápisu funkčního dojde ke kategorizaci příjmu a obrázek je vykreslen jako frekvenční mozaikový graf.
]2. V kapitole Tradiční grafika jsme si vykreslili dotchart pro počet úmrtí ve státu Virginie v roce 1940, kategorizován podle věkových kategorií, pohlaví a regionů. Nakreslete stejný graf pro příjem (Income) kategorizován podle divize (Division) a regionu (Region).
Nejdřív musíme z dat states s pomocí metod agregace vytvořit sumarizační tabulku příjmů v regionech a divizích. Použijeme funkce melt() a cast():
> states.melted<-melt(states, measure.vars = "Income")
> castres<-cast(states.melted, Division+Region~variable, fun.aggregate = mean)
> castres
Division Region Income
1 New England Northeast 4423.833
2 Middle Atlantic Northeast 4863.000
3 South Atlantic South 4355.250
4 East South Central South 3563.750
5 West South Central South 3773.500
6 East North Central North Central 4669.000
7 West North Central North Central 4569.714
8 Mountain West 4402.250
9 Pacific West 5183.200
Podívame se do nápovědy funkce dochart()
> ?dotchart
a sloupce tabulky castres vhodně použijeme jako argumenty x, lables a groups.
> dotchart(castres[,3], labels=castres[,1], group=castres[,2] )
]3. Následující obrázek zobrazuje čtyři základní grafy vytvořené z tabulky states:
... upravte tyto grafy do této podoby - vše s použitím argumentů funkcí.
Obrázek vlevo nahoře:
Podívame se do nápovědy funkce boxplot()
> ?boxplot
Hledaným argumentem je col=, kterým se mění vniřní barva boxplotů. Nakreslíme upravený obrázek:
> boxplot(states$Income~states$Region, col="red")
Obrázek vpravo nahoře:
Podívame se do nápovědy a spustíme příklady funkce pie():
> ?pie
> example(pie)
Zjistíme, že požadovaný obrázek je poslední příklad bez nadpisu
> n <- 200
> pie(rep(1, n), labels = "", col = rainbow(n), border = NA)
Obrázek vlevo dole:
Prozkoumáme obrázek a zjisíme, že se od předchozího líši v nadpisech os i obrázku a má také větší počet intervalů. Opět se podívame do nápovědy:
> ?hist
Dle popisu potřebujeme upravit argumenty: breaks=, xlab=, ylab= a main=:
> hist(states$Income, breaks=20, xlab="Prijem", ylab="Frekvencia", main="Moj histogram")
Obrázek vpravo dole:
Identifikujeme odlišnosti od původního obrázku
- sloupce jsou uspořádány horizontálně
- všechny popisky jsou taktéž orientovány horizontálně
- místo názvu divizí je použito Divis 1, Divis 2 atd.
Znovu začneme vyvoláním nápovědy funkce barplot():
> ?barplot
Zde se dočteme, že pokud je argument horiz=TRUE jsou sloupce kresleny horizontálně a též, že argument names.arg= přidává popisky sloupců. Nápověda se nezmiňuje o argumentu pro kontrolu orientace popisků os ale zjišťujeme, že funkce pracuje s obecnými grafickými parametry přístupnými s pomocí funcke par(). Podíváme se proto do nápovědy k par():
> ?par
v té nalezneme argument las=, kterým se nastavuje orientace popisků u os. Hodnota 1 znamená horizontální umístění.
Zbýva tedy vytvořit vektor nových jmen pro divize:
> jmena<-paste("Divis", seq_along(levels(states$Division)))
a nakreslit obrázek:
> barplot(table(states$Region, states$Division), horiz=TRUE, names.arg=jmena, las=1)
]4. Vytvořte reprezentativní obrázek ze souboru states o čtyřech grafech, ukazující Population a Area (histogram a bodový graf):
Začneme obecným nastavením funkcí:
> par(mfrow=c(2,2))
> hist(states$Population)
> hist(states$Area)
> plot(states$Population)
> plot(states$Area)
Upravíme nadpisy:
> par(mfrow=c(2,2))
> hist(states$Population, ylab="Number of states", xlab="Population", main="")
> hist(states$Area, ylab="Numeber of states", xlab="Area", main="")
> plot(states$Population, ylab="Population")
> plot(states$Area, ylab="Area")
Vyrovnáme rozsahy os:
> par(mfrow=c(2,2))
> hist(states$Population, ylab="Number of states", xlab="Population", main="", ylim=c(0,42), xlim=c(0, 6e+05))
> hist(states$Area, ylab="Numeber of states", xlab="Area", main="", ylim=c(0,42), xlim=c(0,6e+05))
> plot(states$Population, ylab="Population", ylim=c(0, max(states$Area)))
> plot(states$Area, ylab="Area", ylim=c(0, max(states$Area)))
Nakonec přidáme upravení mezer. Protože změna okraju jednotlivých obrázků by nefungovala - obrázky by zůstaly stejné, změníme globální parametr mar=:
> par(mfrow=c(2,2), mar=c(5, 4, 0.5, 0.5))
> hist(states$Population, ylab="Number of states", xlab="Population", main="", ylim=c(0,42), xlim=c(0, 6e+05))
> hist(states$Area, ylab="Numeber of states", xlab="Area", main="", ylim=c(0,42), xlim=c(0,6e+05))
> plot(states$Population, ylab="Population", ylim=c(0, max(states$Area)))
> plot(states$Area, ylab="Area", ylim=c(0, max(states$Area)))
]
5. Jak se dá nakreslit tento obrázek pomocí funkce layout(), ale bez použití argumentů widths= a heights=?
Stačí vytvořit vhodnou matici:
> mat<-matrix(0, nrow=4, ncol=4)
> mat[2:4,1:3]<-1
> mat[1,1:3]<-2
> mat[2:4,4]<-3
> mat
[,1] [,2] [,3] [,4]
[1,] 2 2 2 0
[2,] 1 1 1 3
[3,] 1 1 1 3
[4,] 1 1 1 3
a můžeme kreslit:
> layout(mat)
> sepal.length.hist = hist(iris$Sepal.Length, plot = F)
> sepal.width.hist = hist(iris$Sepal.Width, plot = F)
> par(mar=c(3,2.5,1,1))
> plot(iris$Sepal.Length, iris$Sepal.Width,main = "")
> par(mar=c(0,3,1,1))
> barplot(sepal.length.hist$counts)
> par(mar=c(3,0,1,1))
> barplot(sepal.width.hist$counts, horiz = TRUE)
6. Nakreslete tyto objekty:
Šestiuhelník:
Z geometrie zjistíme souřadnice x a y v rozmezí 0 až 1 a změníme barvu výplně, barvu a šířku čáry:
> grid.polygon(x=c(0.5,0.5+sqrt(3)/2*0.5,0.5+sqrt(3)/2*0.5,0.5,0.5-sqrt(3)/2*0.5,0.5-sqrt(3)/2*0.5),
+ y=c(0,0.25,0.75,1,0.75,0.25), gp=gpar(fill="cyan", col="green", lwd=5))
Kruh:
> grid.circle(r=0.4,gp=gpar(fill="grey", lwd=10))
Obdélník:
> grid.rect(width=0.5, height=0.5, gp=gpar(fill="yellow", col="red", lty=2, lwd=10))
Šipky:
> tmp<-c(0,0.2, 0.4, 0.6)-0.02
> matX<-matrix(c(tmp, tmp+0.2), byrow=T, nrow=2)
> matY<-matrix(c(0,1), ncol=4, nrow=2)
> grid.polyline(matX, matY, id.lengths=rep(2, 4), gp=gpar(col="blue", lwd=10))
> grid.lines(c(0.78,0.98), c(0,1), gp=gpar(col="blue", lwd=10), arrow=arrow())
Text:
> grid.text("text", gp=gpar(col="orange", fontface="italic", cex=5))
Mřížka:
> vp <-viewport(width=0.8,height=0.8,name="view", xscale=c(0,1), yscale=c(0,1))
> pushViewport(vp)
> tmp<-c(0.25, 0.5, 0.75)
> matX<-matrix(tmp, byrow=T, nrow=2, ncol=3)
> matY<-matrix(c(0,1), ncol=3, nrow=2)
> grid.polyline(matX, matY, id.lengths=rep(2, 3), gp=gpar(lty=2))
> grid.polyline(matY, matX, id.lengths=rep(2, 3), gp=gpar(lty=2))
> grid.xaxis(seq(0,1,0.25))
7. V kapitole Další grid funkce jsme vytvořilli tento obrázek:
Změňte v tomto obrázku body za trojúhelníky modré barvy a popište osy. (Nápověda: použijte funkce grid.add a grid.edit).
Nejdříve vytvoříme graf (stejným způsobem jako v kapitole Další grid funkce):
> vp <-viewport(width=0.8,height=0.8,name="view", xscale=c(0,10), yscale=c(0,10))
> x <- xaxisGrob(name = "axis1")
> y <- yaxisGrob(name = "axis2")
> points <- pointsGrob(1:9, 1:9, name="dataPoints")
> title <- textGrob("První graf",name="myTitle",x=0.1,y=0.9)
> tree <- gTree(name="Tree", vp=vp, children=gList(x,y,title,points))
> grid.draw(tree)
Teď tento graf upravíme:
Změníme body
> grid.edit("dataPoints", pch=17, gp = gpar(col="blue"))
Vytvoříme a pridáme popisky
> popisx<-textGrob("os x", x=0.5, y=-0.1, name="popisX")
> grid.add("Tree", popisx)
> popisy<-textGrob("os y", x=-0.1, y=0.5, rot=90, name="popisY")
> grid.add("Tree", popisy)
]