ggplot2 로 그래프 그리기

이번 장에서는 R패키지 ggplot2에 대해 간략히 소개 하고자 한다.

The Grammer of Graphics:그래픽스 문법

ggplot2는 grammer of graphics plot의 약자이다. Leland Wilkinson(Adjunctive Professor of Computer Science, University of Illinois at Chicago)은 2005년 The Grammer of Graphic라는 책을 출간하였으며 우리가 사용하는 ggplot() 명령어는 이에 근거하고 있다. ggplot2 패키지는 Hadley Wickham(Adjunctive Professor of Statistics at Rice University)이 제작하였다. 패키지의 이름은 ggplot2이고 이 패키지에 있는 그래프를 그리는 함수는 ggplot()이다. 전통적인 그래프는 점그래프, 선그래프, 막대그래프, boxplot 등의 외형으로 분류했고 외형에 따라 그리는 방법이 달랐지만 ggplot에서는 외형으로 구분하지 않고 구성성분에 따라 layer by layer로 그래프를 그린다는 점이 다르다.

그래프의 구성

그래픽스 문법에 따르면 그래프 또는 그래픽스의 구성성분은 7개로 나누어 볼 수 있다.

  1. 데이타(data) : ggplot에서는 R의 데이타프레임(data.frame)만 사용 가능하다.
  2. 좌표계(coordinate system) : 좌표계는 데이타가 투영되는 2차원 공간을 말하는 것으로 예를 들어 Cartesian 좌표계(디폴트), polar 좌표계, map projection등이 있다.
  3. 형태(geoms) : data를 나타내는 기하학적인 형태. 예를 들어 점(point), 선(line), 면(area), 다각형(ploygon) 등이 있다.
  4. 미적특징(aesthetics) : 데이타의 시각적 특징을 나타내는 것. 예를 들어 위치, 크기, 색, 투명도 등.
  5. 척도(scale) : 데이타의 미적특징을 수치화하는 척도. 예를 들어 로그척도,색척도,크기척도 등
  6. 통계(stats) : 데이타의 요약에 사용되는 통계학적인 변형. 예를 들어 갯수, 평균, 중앙값, 회귀선 등
  7. 분할(facets) : 데이타를 여러 개의 부분집합으로 나누고 작은 여러 개의 그래프로 분할하여 그리는 것

그래프 그리는 순서

  1. 데이타 할당(data) : 그래프를 그리려면 제일 먼저 어떤 데이타를 사용하는지 지정해주어야 한다. (예: data=acs)
  2. 변수 할당 또는 설정(aes) : 그래프를 그리는데 사용할 변수에 어떤 변수를 할당해줄지 결정해야 한다. 변수들 중 x축 변수는 반드시 필요하다. y축 변수는 경우에 따라 필요하다(히스토그램, 밀도 곡선 등은 x축 변수만 지정하여 그릴 수 있으며 산점도 등에는 x축 변수와 함께 y축 변수가 필요하다). x, y 등 뿐만 아니라 colour, fill, size등에도 변수를 할당(예: colour = Dx)하거나 설정(예: colour = “black”)할 수도 있다. 또한 ggplot2에서는 영국식 철자를 쓰는데 미국식 철자를 써도 대부분 실행되나 간혹 실행이 안되는 경우도 있으므로 가능하면 영국식 철자를 쓰는 것이 좋다.
  3. 형태 설정(geom) : 점(point), 선(line), 면(area), 다각형(ploygon) 등이 여러 형태를 layer by layer로 선택할 수 있다.

좌표계와 척도 등은 기본 값이 있으므로 따로 변경할 필요가 있는 경우를 제외하고는 설정해 주지 않아도 그래프를 그릴 수 있다. 필요에 따라 좌표계/척도의 설정을 변경하거나 통계를 추가하거나 면 분할 등을 추가할 수 있다.

예 1 : 대학교수의 연봉

예를 들어 이전 장에서 그린 대학교수의 연봉에 관한 그래프를 ggplot()을 이용하여 그리는 명령어는 다음과 같다.

require(ggplot2)    # ggplot()을 사용하기 위해
require(car)        # Salaries 데이타을 사용을 위해

str(Salaries)
'data.frame':   397 obs. of  6 variables:
 $ rank         : Factor w/ 3 levels "AsstProf","AssocProf",..: 3 3 1 3 3 2 3 3 3 3 ...
 $ discipline   : Factor w/ 2 levels "A","B": 2 2 2 2 2 2 2 2 2 2 ...
 $ yrs.since.phd: int  19 20 4 45 40 6 30 45 21 18 ...
 $ yrs.service  : int  18 16 3 39 41 6 23 45 20 18 ...
 $ sex          : Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 2 2 2 1 ...
 $ salary       : int  139750 173200 79750 115000 141500 97000 175000 147765 119250 129000 ...
ggplot(aes(x=yrs.service,y=salary),data=Salaries)       # 데이타와 변수 할당
Error: No layers in plot

위의 명령어를 실행해보면 “No layers in plot”이라는 에러 메시지가 나타난다. ggplot을 그리라는 명령어에 사용할 데이타는 Salaries 데이타이고 그 데이타 중 x변수에 yrs.service를 할당해주고 y변수에 salary를 할당해주었지만 무엇을 그리라고는 말해주지 않았기 때문이다.

다음 명령어로 데이타와 좌표의 할당이 잘 되어 있는지 확인할수 있다.

p <- ggplot(aes(x=yrs.service,y=salary),data=Salaries)  # 데이타와 변수 할당
p + geom_blank()                                        # 빈그래프 그림 

점을 이용한 scatterplot을 그리려면 여기에 geom_point() 를 추가하면 된다.

p + geom_point()                                        # 점그래프추가     

성별에 따라 색깔을 구분하고 싶으면 colour에 sex를 할당해주면 된다.

p <- ggplot(aes(x=yrs.service,y=salary,colour=sex),data=Salaries) # colour변수 할당
p + geom_point()                                        # 점그래프추가    

여기에 회귀선을 추가하려면 geom_smooth()를 덧그리면 된다. 기본적으로 비선형회귀인 loess회귀가 적용되며 colour에 sex가 할당되어 있으므로 회귀선이 색깔 별로 두개 그려진다.

p + geom_point(aes(colour=sex)) +       # 점그래프 추가
    geom_smooth()                       # 회귀선 추가

성별에 따라 두개로 나뉘어진 그래프를 그리고 싶으면 facet을 시용하면 된다.

p + geom_point(aes(colour=sex)) +       # 점그래프 추가
    geom_smooth() +                     # 회귀선 추가
    facet_grid(~sex)                    # 면을 수직으로 분할 

예 2 : 진단명과 나이

또 다른 예를 보자. moonBook 패키지에 포함되어 있는 acs 데이타를 이용하여 진단명(Dx)에 따른 나이의 차이를 point, violin plot, boxplot 등을 겹쳐 그린 예이다.

plot.png

웹 R 에서는 ggplot() 을 보다 쉽게 사용하게 하기 위해 “웹에서 하는 ggplot2” 앱을 개발하여 클릭만으로 ggplot()명령어를 만들고 plot을 그림으로써 R에 익숙하지 않은 사용자라도 높은 품질의 plot을 쉽게 그릴 수 있도록 했으며 또한 R 명령어를 같이 보여줌으로써 R에 익숙해질 수 있도록 하였다.