Skip to content

R (프로그래밍 언어) ggplot2 #

Find similar titles

26회 업데이트 됨.

Edit
  • 최초 작성자
    Dongsoo
  • 최근 업데이트
    lca

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 그래프의 기본이 되는 입력데이터의 구조는 다음과 같다.

MarkDown

기본적으로 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에 해당하는 컬럼의 이름을 넣어준다. 아래의 명령어는 산포도 그래프의 활용 예시 이다.

산포도 그래프의 활용 #

  1. 점의 색을 빨강색으로

    p + geom_point(color = 'red')
    
  2. 점의 색을 gear에 따라 달리

    p + geom_point(aes(color = factor(gear)))
    
  3. 점과 점을 잇는 선으로 표현

    p + geom_line()
    
  4. 선의 색을 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')

주상도표 그래프와 밀도 그래프의 활용 #

  1. 각 막대를 빨간색으로 채우려할 때

    p + geom_histogram(fill = 'red')
    p + geom_density(fill = 'red')
    
  2. 막대의 태두리를 빨간색으로

    p + geom_histogram(colour = 'red')
    p + geom_density(colour = 'red')
    
  3. 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) #

MarkDown <http://cfile4.uf.tistory.com>

박스플롯을 기본적으로 인자 값의 분포를 볼 수 있다는 점에서 주상도표 그래프, 밀도 그래프와 같다. 아웃라이어(outlier), 최대값(max), 최소값(min), 1,3분위수(qualtile), 중위값(median)을 볼 수 있다. 이를 통해 개체 혹은 집단 간 분포의 차이를 눈으로 확인하는데 이용할 수 있다.

    p = ggplot(mtcars, aes(x = factor(gear), y = mpg))
    p + geom_boxplot()

박스플롯의 활용 #

  1. 박스플롯을 빨간색으로 채우고 싶을 때

    p + geom_boxplot(fill = 'red')
    
  2. 박스플롯의 색을 gear 별로 달리 하고 싶을 때

    p + geom_boxplot(aes(fill = factor(gear)))
    

히트맵(Heatmap) #

히트맵은 정량적(quantitative) 혹은 정성적(qualitative) 데이터를 표현하는 대표적인 방법이다. 데이터의 값의 범위에 따라 색의 그라데이션을 달리함으로써 시료간 연관성을 직관적으로 확인할 수 있다.

MarkDown <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와 같은 다변수데이터의 가시화에 효과적이다. 하지만 다변수(또는 다변량)데이터의 경우 값의 범위 별 분포가 달라 색이 편중되는 경우가 있다. 위의 예가 그러하다.

히트맵의 활용 #

  1. 변수의 정규화(normalization)

    scaled = scale(mtcars)
    scaled_melted = melt(data.matrix(scaled))
    p = ggplot(scaled, aes(Var1, Var2)) + geom_tile(aes(fill = value))
    
  2. 색 변경(대비색: 파랑-빨강)

    p + scale_fill_gradient2(low = 'blue', mid = 'white', high = 'red')
    
  3. 색 변경(밝기)

    p + scale_fill_gradient2(low = 'white', high = 'red')
    
  4. 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()

추세선의 활용 #

  1. 추세선의 표준오차 제거

    디폴트로 그릴 경우 위 그림같이 그려진다. 이때값의 수에 따라 자동으로 추세선 계산시 사용되는 방법이 결정된다. 위 그래프에서 회색선에 해당하는 영역은 표준오차를 나타낸다. 만약 표준오차를 표시하고 싫다면 아래와 같이 입력하면된다.
    
    p + geom_point() + geom_smooth(se = F)
    
  2. 변인에 따른 추세선 분리

    여기에 변인 gear를 추가하여 'gear'에 따른 'mpg'값에 대한 'wt'의 값의 추세선을 그려보자
    
    p + geom_point() + geom_smooth(aes(color = factor(gear)))
    
  3. 회귀식 지정

    도식화의 목적에 따라 추세선에 사용되는 회귀식의 변경도 가능하다. 현제 데이터의 경우 '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
  4. 회귀식 표시

    다음은 추세선의 계수(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 축 레이블 및 타이틀의 변경 #

  1. x축 각도 변경(반시계 60도 회전)

    p + theme(axis.text.x = element_text(angle = 60))
    
  2. x축 글씨체 변경(굵은 글씨)

    p + theme(axis.text.x = element_text(face = 'bold'))
    
  3. x축 글씨크기 변경

    p + theme(axis.text.x = element_text(size = 20))
    
  4. x축 글씨색 변경

    p + theme(axis.text.x = element_text(color = 'red'))
    
  5. y축 글씨색 변경 시

    p + theme(axis.text.y = element_text(color = 'red'))
    
  6. 타이틀 글씨색 변경 시

    p + theme(plot.title = element_text(color = 'red'))
    
  7. x축, y축 및 타이틀 변경

    # x축 타이틀
    p + xlab('x axis')
    
    # y축 타이틀
    p + ylab('y axis')
    
    # plot 타이틀
    p + ggtitle('Plot title')
    

추가정보 #

설명한 네가지 그래프를 그리는 명령어로부터 한가지 중요한 규칙이 있다. 바로 각각의 plot 함수에 변수를 선언할 때 aes() 함수를 써주어야 반영이 된다는 것이다. aes() 없이 색, 크기 등을 넣어주면 환경변수로써 작용하여 그림 전체에 영향을 미치게 된다.

Suggested Pages #

0.0.1_20231010_1_v71