Table of Contents
ggplot2 #
R graphics #
R은 통계프로그램일 뿐만 아니라 그래픽도구로서의 역할도 한다. 기본적인 2차원 scatter plot 부터, bar plot, line plot, box plot을 간단한 코드를 이용해 그릴 수 있다. 나아가 3차원으로 표현하거나 pie chart, heatmap, dendrogram 등 가능한 모든 데이터 표현방식을 지원한다고 해도 과언이 아니다. 그 중에서도 색(color), 크기(size), 글씨체(font)를 customize 하는데 있어 다양한 패키지를 제공한다. 그 중 하나가 ggplot2 패키지 이다. 이 글에서는 ggplot2 패키지를 이용한 plotting의 기초로 산포도 그래프(scatter plot), 주상도표(histogram)와 밀도그래프(density) 그리고 박스플롯(box plot)을 그려보겠다.
ggplot 데이터 구조 #
우선 ggplot 그래프의 기본이 되는 입력데이터의 구조는 다음과 같다.
기본적으로 plot을 그리기 위해서는 변인(variable)과 값(value)이 필요하다. 하나의 변인은 둘 이상의 값을 갖는다. 위의 그림을 예로 든다면 위 표에서 성별(sex)을 변인으로 보았을 때 일(day) 별 길이(length)가 값이 될 수 있다.
물론 예외적으로 list와 같은 object 형태의 데이터를 받는 경우가 있지만 이 글에서는 일반적인 테이블구조의 데이터를 이용하도록 하겠다.
ggplot의 설치 #
Installation
install.packages('ggplot2')
or
source('http://bioconductor.org/biocLite.R')
biocLite()
biocLite('ggplot2')
import library
library(ggplot2)
ggplot을 이용한 plotting의 기초 #
ggplot2는 ggplot() 혹은 qplot() 함수를 기본으로 하여 사용자가 원하는 그래프, 글씨의 크기 등을 조정하거나 추가하는 방식이다. 사용함수는 아래와 같다.
1. ggplot()
ggplot(...) + plot의 종류(eg. box plot, bar plot, scatter plot 등)<BR>
2. qplot()
qplot(..., geom = c(plot의 종류))<BR>
산포도 그래프(Scatter plot) #
산포도 그래프는 두 변수간(x, y, eg. 키-몸무게)간 상관성(correlation)을 보는 것을 목적으로한다. 아래의 예는 가장 기본적인 산포도 그래프(scatter plot)이다.
p = ggplot(mtcars, aes(x = mpg, y = wt))
p + geom_point()
또는
qplot(x = mpg, y = wt, data = mtcars)
산포도 그래프는 기본적으로 변수 x 와 y로 그려진다. ggplot()의 경우 aes(aesthetic)함수 안에 x, y에 해당하는 컬럼의 이름을 넣어준다. 아래의 명령어는 산포도 그래프의 활용 예시 이다.
산포도 그래프의 활용 #
-
점의 색을 빨강색으로
p + geom_point(color = 'red')
-
점의 색을 gear에 따라 달리
p + geom_point(aes(color = factor(gear)))
-
점과 점을 잇는 선으로 표현
p + geom_line()
-
선의 색을 gear에 따라서
p + geom_line(aes(color = factor(gear)))
주상도표(Histogram)와 밀도(Density)그래프 #
주상도표와 밀도그래프는 인자값의 분포(distribution)를 본다는 점에서 통계 검정법의 선정을 위한 근거자료로 사용할 수 있다. 또한 특정 인자의 값이 집단 별 분포의 차이를 보기위해서도 사용할 수 있다.
주상도표
p = ggplot(mtcars, aes(mpg))
p + geom_histogram()
또는
qplot(x = mpg, data = mtcars, geom = 'histogram')
밀도 그래프
p + geom_density()
또는
qplot(x = mpg, data = mtcars, geom = 'density')
주상도표 그래프와 밀도 그래프의 활용 #
-
각 막대를 빨간색으로 채우려할 때
p + geom_histogram(fill = 'red') p + geom_density(fill = 'red')
-
막대의 태두리를 빨간색으로
p + geom_histogram(colour = 'red') p + geom_density(colour = 'red')
-
gear 별 분포(gear 별로 색을 달리)
p + geom_histogram(aes(fill = factor(gear), group = factor(gear)), position = 'dodge') p + geom_density(aes(fill = factor(gear), group = factor(gear)), position = 'dodge')
박스플롯(Box plot) #
<http://cfile4.uf.tistory.com>
박스플롯을 기본적으로 인자 값의 분포를 볼 수 있다는 점에서 주상도표 그래프, 밀도 그래프와 같다. 아웃라이어(outlier), 최대값(max), 최소값(min), 1,3분위수(qualtile), 중위값(median)을 볼 수 있다. 이를 통해 개체 혹은 집단 간 분포의 차이를 눈으로 확인하는데 이용할 수 있다.
p = ggplot(mtcars, aes(x = factor(gear), y = mpg))
p + geom_boxplot()
박스플롯의 활용 #
-
박스플롯을 빨간색으로 채우고 싶을 때
p + geom_boxplot(fill = 'red')
-
박스플롯의 색을 gear 별로 달리 하고 싶을 때
p + geom_boxplot(aes(fill = factor(gear)))
히트맵(Heatmap) #
히트맵은 정량적(quantitative) 혹은 정성적(qualitative) 데이터를 표현하는 대표적인 방법이다. 데이터의 값의 범위에 따라 색의 그라데이션을 달리함으로써 시료간 연관성을 직관적으로 확인할 수 있다.
<https://learnr.wordpress.com/2010/01/26/ggplot2-quick-heatmap-plotting/>
library(reshape2)
melted = melt(data.matrix(mtcars))
p = ggplot(melted, aes(Var1, Var2)) + geom_tile(aes(fill = value))
특히 microarray와 같은 다변수데이터의 가시화에 효과적이다. 하지만 다변수(또는 다변량)데이터의 경우 값의 범위 별 분포가 달라 색이 편중되는 경우가 있다. 위의 예가 그러하다.
히트맵의 활용 #
-
변수의 정규화(normalization)
scaled = scale(mtcars) scaled_melted = melt(data.matrix(scaled)) p = ggplot(scaled, aes(Var1, Var2)) + geom_tile(aes(fill = value))
-
색 변경(대비색: 파랑-빨강)
p + scale_fill_gradient2(low = 'blue', mid = 'white', high = 'red')
-
색 변경(밝기)
p + scale_fill_gradient2(low = 'white', high = 'red')
-
x, y축의 변경
p + coord_flip()
히트맵 참고내용 #
히트맵의 앞서 설명처럼 집단 혹은 개체간 차이(difference), 양상(pattern)을 직관적으로 보고자 함이다. 전자의 경우 주로 이원적 집단(eg. 환자-일반인) 간 비교를 위함이기 때문에 색 역시 대비를 이루는 것이 좋다(eg. 빨강-파랑, 빨강-녹색). 후자의 경우 값의 변화를 보는 것이 목적이고 시계열(time course)데이터가 그 예이다. 이 때는 단일색의 밝기 변화를 통해 양상을 확인하는 것이 좋다.
추세선(Regression line) #
도식화에 있어 모든 값의 분포를 볼 수 있는 산포도를 앞서 살펴보았다. 이번에는 변인에 따른 값의 변화 추이를 도식화하는 방법으로써 추세선을 그리는 법을 적고자 한다.
추세선은 통계적으로 선형계수를 이용한 선형그래프 형태로 표현할 수 있으며 ggplot2에서는
geom_smooth() 라는 함수를 이용한다. 아래의 코드는 mpg에 따른 wt의 값에 대한 추세선을 그리는 것이다.
library(ggplot2)
p = ggplot(mtcars, aes(x = mpg, y = wt))
p + geom_point() + geom_smooth()
추세선의 활용 #
-
추세선의 표준오차 제거
디폴트로 그릴 경우 위 그림같이 그려진다. 이때값의 수에 따라 자동으로 추세선 계산시 사용되는 방법이 결정된다. 위 그래프에서 회색선에 해당하는 영역은 표준오차를 나타낸다. 만약 표준오차를 표시하고 싫다면 아래와 같이 입력하면된다. p + geom_point() + geom_smooth(se = F)
-
변인에 따른 추세선 분리
여기에 변인 gear를 추가하여 'gear'에 따른 'mpg'값에 대한 'wt'의 값의 추세선을 그려보자 p + geom_point() + geom_smooth(aes(color = factor(gear)))
-
회귀식 지정
도식화의 목적에 따라 추세선에 사용되는 회귀식의 변경도 가능하다. 현제 데이터의 경우 'loess'가 사용됐는데 'linear model'변경 하고 싶다면 아래같이 method 값을 설정해주면 된다. p + geom_point() + geom_smooth(aes(color = factor(gear)), method = lm) 디폴트 값은 'method = auto' 즉 주어진 값의 수에 따라 자동으로 coefficient 값 계산 법을 결정해 주는 것이다. 여기서는 각각의 함수에 대해 다루지는 않겠다.
ggplot2에서는 아래 다섯가지의 regression method를 제공한다.
- linear mode(lm)
- generalized linear model(glm)
- generalized additive model(gam)
- robust linear model(rlm)
- loess
-
회귀식 표시
다음은 추세선의 계수(r2)과 공식을 표시하는 방법이다. 공식을 계산하는 함수는 다음 소스에서 가져왔다.(http://goo.gl/K4yh) 먼저 아래 함수를 로딩시킨다. lm_eqn <- function(df, x, y){ m <- lm(y ~ x, df); eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2, list(a = format(coef(m)[1], digits = 2), b = format(coef(m)[2], digits = 2), r2 = format(summary(m)$r.squared, digits = 3))) as.character(as.expression(eq)); } lm_eqn(데이터 테이블, x 축, y축) equation = lm_eqn(mtcars, mtcars$wt, mtcars$mpg) p + geom_point() + geom_smooth(method = lm)+ geom_text(x = 15, y = 1, label = equation, parse = TRUE)
그 외 #
막대그래프(bar plot)와 오차범위(error bar) 표시 #
정량 데이터의 경우 집단의 평균과 표준편자를 표시하여 집단 간 차이를 보여주는 경우가 일반적이다. 대표적으로 막대그래프(bar plot)가 있다. 아래의 예는 앞서 mtcars데이터에서 gear 별 mpg에 대한 막대그래프이다.
library(ddply)
Mean_SD = ddply(mtcars, .(gear), summarize, mean = round(mean(mpg), 2), se = round(sd(mpg)/sqrt(nrow(mtcars)), 2))
Plotting에 앞서 gear 별 평균(mean)과 표준오차(se, standard error)를 계산하여 테이블로 만든다.
ggplot(Barplot, aes(x = gear, y = mean, fill = factor(gear))) + geom_bar(position = 'dodge', stat = 'identity') + geom_errorbar(aes(ymin = mean-se, ymax = mean+se), width = .5)
막대그래프는 geom_bar()로 그리며 이때 각 각의 bar가 gear를 나타내게 하기 위해 position = 'dodge'를 써준다(디폴트는 누적(stacked) 막대그래프이다.). 오차범위 표시를 위해서는 geom_errorbar()를 써주며 이 때 ymax(mean+sd)와 ymin(mean-sd)을 지정해준다. 오차대신 표준편차(standard deviation)를 써도 된다.
x, y 축 레이블 및 타이틀의 변경 #
-
x축 각도 변경(반시계 60도 회전)
p + theme(axis.text.x = element_text(angle = 60))
-
x축 글씨체 변경(굵은 글씨)
p + theme(axis.text.x = element_text(face = 'bold'))
-
x축 글씨크기 변경
p + theme(axis.text.x = element_text(size = 20))
-
x축 글씨색 변경
p + theme(axis.text.x = element_text(color = 'red'))
-
y축 글씨색 변경 시
p + theme(axis.text.y = element_text(color = 'red'))
-
타이틀 글씨색 변경 시
p + theme(plot.title = element_text(color = 'red'))
-
x축, y축 및 타이틀 변경
# x축 타이틀 p + xlab('x axis') # y축 타이틀 p + ylab('y axis') # plot 타이틀 p + ggtitle('Plot title')
추가정보 #
설명한 네가지 그래프를 그리는 명령어로부터 한가지 중요한 규칙이 있다. 바로 각각의 plot 함수에 변수를 선언할 때 aes() 함수를 써주어야 반영이 된다는 것이다. aes() 없이 색, 크기 등을 넣어주면 환경변수로써 작용하여 그림 전체에 영향을 미치게 된다.
Suggested Pages #
- 0.025 R (체스)
- 0.025 CSV
- 0.025 R (수학)
- 0.013 실수
- More suggestions...