Pakiet R w analizie uk³adów z³o¿onych

LABORATORIUM 6

Podstawy ggplot2

Ggplot2 jest bibliotek±, pozwalaj±c± na tworzenie eleganckich grafik i wykresów. Jest szczególnie przydatna w przypadku analizy danych wielowymiarowych oraz jako pomoc do data mining. Bibliotekê uruchamiamy komend± library(ggplot2) (w przypadku braku, nale¿y zainstalowaæ j± uzywaj±c komendy install.packages("ggplot2")).

# PRZYK£AD 6.1
library(ggplot2)

Podstawowe dwie cechy pakietu: dane, które chcemy wy¶wietliæ, musz± byæ typu dataframe, wykresy sk³adaj± siê z warst, które dodajemy do bazowego obiektu.

Bazow± funkcj±, od której musimy zacz±æ tworzenie ka¿dego wykresu jest ggplot(). Jako jej argument mo¿na podaæ od razu zbiór danych, który bêdziemy wykorzystywaæ, mapuj±c poprzez funkcjê aes() (aesthethics - w³a¶ciwo¶ci) cechy. Samo wywo³anie funkcji ggplot(), nawet z okre¶leniem mapowania, nie da ¿adnego sensownego efektu.

# PRZYK£AD 6.2
df1 <- data.frame(a = 1:10, b = (1:10) + runif(10,-2,2), c = 1:10)
df1
##     a           b  c
## 1   1 -0.09231008  1
## 2   2  2.58382278  2
## 3   3  1.22309316  3
## 4   4  4.63823631  4
## 5   5  3.33092881  5
## 6   6  7.14357045  6
## 7   7  7.76237387  7
## 8   8  8.52052758  8
## 9   9  9.47729429  9
## 10 10  8.21783655 10
ggplot(df1, aes(x = a, y = b))

Dopiero ustalenie odpowiedniej warstwy (w tym przypadku chcemy narysowaæ punkty za pomoc± geometrii geom_point()) umo¿liwia otrzymanie wykresu.

# PRZYK£AD 6.3
ggplot(df1, aes(x = a, y = b)) + geom_point()

Nale¿y przy tym zwróciæ uwagê, ¿e ten sam wykres mo¿e zostaæ otrzymany za pomoc± ró¿nych operacji

# PRZYK£AD 6.4
ggplot(df1, aes(x = a, y = b)) + geom_point()
ggplot(df1) + geom_point(aes(x = a, y = b))
ggplot() + geom_point(data = df1, aes(x = a, y = b))
ggplot(df1, aes(x = a)) + geom_point(aes(y = b))

Poza tym mo¿na (a nawet jest do¶æ polecane dla czysto¶ci kodu) umie¶ciæ bazow± warstwê w zmiennej i nastepnie dodawaæ do niej kolejne warstwy.

# PRZYK£AD 6.5
g <- ggplot(df1, aes(x = a, y = b))
g + geom_point()

Istotn± opcj± jest mo¿liwo¶æ "podmiany" ¼ród³owego zbioru danych "w locie" za pomoc± operatora %+%

# PRZYK£AD 6.6
df2 <- data.frame(a = 1:10, b = (1:10)+runif(10,-2,2), c = 1:10)
g <- ggplot(df1)
g + geom_point(aes(x = a, y = b))

g %+% df2 + geom_point(aes(x = a, y = b))

Modyfikowanie w³a¶ciwo¶ci

Operuj±c cechami size="", shape="", colour="" oraz fill="", a tak¿e dodaj±c kolejne warstwy, otrzymujemy po¿±dany efekt.

# PRZYK£AD 6.7
g <- ggplot(df1, aes(x = a))
g + geom_point(aes(y=b), size=4, shape=22, colour="red") + 
  geom_point(aes(y = c), size=3, shape=21, fill="blue")

g + geom_point(aes(y=b), size=4, shape=22, colour="red", fill="blue") + 
  geom_line(aes(y = c), size=1.2, linetype=3, colour="darkgreen")

Ggplot2 umo¿liwia automatyczne dodanie dopasowania liniowego do serii danych za pomoc± warstwy geom_smooth().

# PRZYK£AD 6.8
g <- ggplot(df1, aes(x = a))
g + geom_smooth(aes(y = b), method="lm", size=1.2, colour="red") + 
  geom_point(aes(y = b), shape=21, size=3, fill="black")

Grupowanie

Umieszczenie wszystkich danych w jednej kolumnie oraz stworzenie dodatkowej (dodatkowych) kolumn, okre¶laj±cych serie daje mo¿liwo¶æ skorzystania z automatycznego przypisywania cech.

# PRZYK£AD 6.9
df2 <- data.frame(a = c(df1$a, df1$a), b = c(df1$b, df1$c), n = sample(20), ser = c(rep("S1",10), rep("S2", 10)))
df2
##     a           b  n ser
## 1   1 -0.09231008 15  S1
## 2   2  2.58382278 18  S1
## 3   3  1.22309316 12  S1
## 4   4  4.63823631 19  S1
## 5   5  3.33092881  1  S1
## 6   6  7.14357045 10  S1
## 7   7  7.76237387  8  S1
## 8   8  8.52052758 14  S1
## 9   9  9.47729429  2  S1
## 10 10  8.21783655  3  S1
## 11  1  1.00000000 13  S2
## 12  2  2.00000000  4  S2
## 13  3  3.00000000 11  S2
## 14  4  4.00000000  6  S2
## 15  5  5.00000000  9  S2
## 16  6  6.00000000 17  S2
## 17  7  7.00000000  5  S2
## 18  8  8.00000000 16  S2
## 19  9  9.00000000  7  S2
## 20 10 10.00000000 20  S2
g <- ggplot(df2)
g + geom_point(aes(x = a, y = b, fill=ser), size=3, shape=21)

g + geom_point(aes(x = a, y = b, shape=ser), size=3, colour="blue")

Bardzo u¿ytecznym zabiegiem jest tak¿e mapowanie rozmiaru, szczególnie, gdy ma on okre¶laæ np liczbê obserwacji wchodz±cych do danego punktu.

# PRZYK£AD 6.10

g + geom_point(aes(x = a, y = b, fill=ser, size=n), shape=21)

Nale¿y przy tym zwróciæ uwagê (polecenie group=""), czy odnosimy siê do wszystkich serii danych na raz, czy te¿ do ka¿dej oddzielnie.

# PRZYK£AD 6.11

# Tworzenie danych
x1 <- 1:10; x2 <- 5:15; x3 <- 10:20
y1 <- x1 + runif(10,-2,2)
y2 <- x2 + runif(11,-3,3)
y3 <- x3 + runif(11,-2,2)
df3 <- data.frame(x = c(x1, x2, x3), y = c(y1, y2, y3), ser = c(rep("S1", 10), rep("S2", 11), rep("S3", 11)))
df3
##     x          y ser
## 1   1 -0.9578545  S1
## 2   2  2.4491988  S1
## 3   3  4.4630838  S1
## 4   4  2.4062316  S1
## 5   5  5.8655037  S1
## 6   6  5.1614899  S1
## 7   7  5.8867607  S1
## 8   8  9.1002091  S1
## 9   9 10.2572802  S1
## 10 10  9.1820191  S1
## 11  5  2.0310812  S2
## 12  6  7.1508491  S2
## 13  7  5.9193977  S2
## 14  8  6.9282656  S2
## 15  9  8.9019502  S2
## 16 10 11.2601269  S2
## 17 11  9.6670311  S2
## 18 12 10.8112011  S2
## 19 13 10.1961095  S2
## 20 14 15.5607336  S2
## 21 15 16.7281949  S2
## 22 10 10.5106910  S3
## 23 11 11.9324524  S3
## 24 12 12.7641407  S3
## 25 13 11.5223971  S3
## 26 14 14.8441333  S3
## 27 15 16.7367842  S3
## 28 16 14.5326726  S3
## 29 17 17.0568622  S3
## 30 18 18.1522300  S3
## 31 19 19.3415185  S3
## 32 20 19.3480695  S3
g <- ggplot(df3)

p <- geom_point(aes(x = x, y = y, fill = ser), size=3, shape=21)
g + p

# Dopasowanie do wszystkich punktow
g + p + geom_smooth(aes(x = x, y = y), method = "lm")

# Dopasowanie do poszczegolnych serii
g + p + geom_smooth(aes(x = x, y = y, group = ser, colour=ser), method = "lm")

Przezroczysto¶æ

Bardzo wygodnym narzêdziem jest opcja alpha="" ustawiaj±ca przezroczysto¶æ obiektów. Jest to szczególnie u¿yteczne w przypadku du¿ej ilo¶ci danych, gdy punkty nak³adaj± siê na siebie.

# PRZYK£AD 6.12

x <- rnorm(10000, 0, 1); y <- rnorm(10000, 0, 1)
df.norm <- data.frame(x = x, y = y)
g <- ggplot(df.norm)

# Bez przezroczystosci
g + geom_point(aes(x = x, y = y), shape = 21)

# Z przezroczystoscia
g + geom_point(aes(x = x, y = y), shape = 21, alpha = 0.25)

# PRZYK£AD 6.13

# Bez przezroczystosci
df.norm <- data.frame(x = rnorm(10000,0,1), y=rnorm(10000,0,1))
df.norm1 <- data.frame(x = rnorm(10000,2,1), y=rnorm(10000,-2,1))
df.norm2 <- data.frame(x = rnorm(10000,-2,1), y=rnorm(10000,-2,1))
g <- ggplot(df.norm)

g + geom_point(aes(x = x, y = y), shape=21, fill="blue", colour="blue") + 
geom_point(data = df.norm1, aes(x = x,y = y), shape=21, fill = "darkgreen", colour = "darkgreen") + 
geom_point(data = df.norm2, aes(x = x,y = y), shape=21, fill = "red", colour = "red")

# Z przezroczystoscia

g + geom_point(aes(x = x, y = y), shape=21, fill="blue", colour="blue", alpha=0.1) + 
geom_point(data=df.norm1, aes(x=x,y=y), shape=21, fill="darkgreen", colour="darkgreen", alpha=0.1) + 
geom_point(data=df.norm2, aes(x=x,y=y),shape=21,fill="red",colour="red", alpha=0.1)

Histogramy

Za pomoc± geometrii geom_histogram() mo¿na utworzyæ histogram warto¶ci. W poni¿szym przyk³adzie najpierw w zmiennej typu dataframe utworzymy kilka serii danych, a nastepnie zacznimy od wizualizacji jedynie dwóch z nich.

# PRZYK£AD 6.14

N1 <- 10000
N2 <- 5000
N3 <- 20000

sigma1 <- 1
sigma2 <- 0.5

mu <- 0

x1 <- rnorm(N1, mu, sigma1)
x2 <- rnorm(N2, mu, sigma1)
x3 <- rnorm(N3, mu, sigma1)
x4 <- rnorm(N1, mu, sigma2)
x5 <- rnorm(N2, mu, sigma2)
x6 <- rnorm(N3, mu, sigma2)

label.size <- c(rep("Size 1", N1), rep("Size 2", N2), rep("Size 3", N3))
label.par <- c(rep("Par 1", N1 + N2 + N3), rep("Par 2", N1 + N2 + N3))

df <- data.frame(x = c(x1, x2, x3, x4, x5, x6), size = c(label.size, label.size), par = label.par)

g1 <- ggplot(data = df[df$size == "Size 1",])
g1 + geom_histogram(aes(x = x, fill = par, colour = par))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Za pomoc± opcji position="" mo¿na sterowaæ wygl±dem histogramów - domy¶lne position="stack" ustawia jeden s³upek na drugim, position="fill" normalizuje sumê do jedynki, position="dodge" ustawia jeden obok drugiego. Opcja position="identity" przes³ania jedn± seriê drug±, wiêc przydatne jest u¿ycie cechy przezroczysto¶ci.

# PRZYK£AD 6.15

g1 + geom_histogram(aes(x = x, fill = par, colour = par), position="identity", alpha=0.3)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Aby zamiast liczby zliczeñ uzyskaæ gêsto¶æ prawdopodobieñstwa mo¿na skorzystaæ albo z geometrii geom_density() albo te¿ z opcji ..density.., podanej po zmiennej. Je¶li dodatkowo potrzebujemy wykre¶liæ pewn± funkcjê (np. gêsto¶æ prawdopodobieñstwa rozk³adu normalnego), korzystamy wtedy z funkcji stat_function(). Podajemy w niej funkcjê (fun=...) oraz jej parametry za pomoc± listy (args = list(...)).

# PRZYK£AD 6.16

g1 + geom_density(aes(x = x, fill = par), colour="black", alpha=0.3)

g1 + geom_histogram(aes(x = x,..density.., fill = par, colour = par), position="identity", alpha=0.3) +
stat_function(fun = dnorm, args = list(mean = 0, sd = 0.5))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Warunkowanie

W naszym przypadku mamy do czynienia z trzema ró¿nymi rozmiarami próbek oraz dwiema warto¶ciami parametru. Wygodnie jest wykorzystaæ mechanizm warunkowania za pomoc± funkcji facet_grid().

# PRZYK£AD 6.17

g2 <- ggplot(data = df)
g2 + geom_histogram(aes(x = x,..density.., fill = size, colour = size), alpha=0.6) + facet_grid(size ~ par)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.