이번 장에서는 R패키지 ggplot2에 대해 간략히 소개 하고자 한다.
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개로 나누어 볼 수 있다.
좌표계와 척도 등은 기본 값이 있으므로 따로 변경할 필요가 있는 경우를 제외하고는 설정해 주지 않아도 그래프를 그릴 수 있다. 필요에 따라 좌표계/척도의 설정을 변경하거나 통계를 추가하거나 면 분할 등을 추가할 수 있다.
예를 들어 이전 장에서 그린 대학교수의 연봉에 관한 그래프를 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) # 면을 수직으로 분할
또 다른 예를 보자. moonBook 패키지에 포함되어 있는 acs 데이타를 이용하여 진단명(Dx)에 따른 나이의 차이를 point, violin plot, boxplot 등을 겹쳐 그린 예이다.
웹 R 에서는 ggplot() 을 보다 쉽게 사용하게 하기 위해 “웹에서 하는 ggplot2” 앱을 개발하여 클릭만으로 ggplot()명령어를 만들고 plot을 그림으로써 R에 익숙하지 않은 사용자라도 높은 품질의 plot을 쉽게 그릴 수 있도록 했으며 또한 R 명령어를 같이 보여줌으로써 R에 익숙해질 수 있도록 하였다.