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))
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")
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")
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)
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`.
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`.