여러 개의 그래프를 하나에 그리기(Combining Graphs)
R에서는 여러 개의 그래프를 합쳐서 하나로 그리기 쉬운데 par() 또는 layout() 함수를 사용한다.
먼저 par()함수를 사용할 때는 인수인 mfrow=c(nrows,ncols)를 사용하여 nrows*ncols개의 plot으로 분할하는데 그림이 그려지는 순서는 열(row)에 의해 채워진다. mfcol=c(nrows,ncols)를 사용해도 비슷한데 이때는 행(column)을 기준으로 채워진다.
- 네개의 그래프를 2*2로 배열하기
예를 들어 다음의 코드는 네개의 plot을 만들고 두열과 두행으로 배열한다. 내장 데이타인 mtcars를 사용한다. mtcars는 자동차에 관한 데이타로 궁금하신 분은 mtcars를 입력해보기 바란다.
> mtcars
# Figure 3.14
> attach(mtcars)
#현재 상태를 opar에 저장한다
> opar <- par(no.readonly = TRUE)
# 화면을 2*2로 나눈다
> par(mfrow = c(2, 2))
> plot(wt, mpg, main = "Scatterplot of wt vs. mpg")
> plot(wt, disp, main = "Scatterplot of wt vs disp")
> hist(wt, main = "Histogram of wt")
> boxplot(wt, main = "Boxplot of wt")
#다시 opar 상태로 되돌린다.
> par(opar)
> detach(mtcars)
결과는 그림 3.14와 같다.
그림 3.14
2) 두번째 예는 세개의 그래프를 세 행과 한 열로 배열해 본다(>커서는 생략한다)
# Figure 3.15
attach(mtcars)
opar <- par(no.readonly = TRUE)
par(mfrow = c(3, 1))
hist(wt)
hist(mpg)
hist(disp)
par(opar)
detach(mtcars)
그림 3.15
결과는 그림 3.15와 같다. 고수준 함수인 hist()는 디폴트 타이틀이 포함되는데 제목을 나오지 않게 하려면 main= “ “ 을 사용하거나 ann=FALSE를 사용하여 제목과 label 을 나오지 않게 할수 있다.
3) 열 또는 행 마다 그림 갯수를 달리할때
layout함수는 layout(mat)와 같은 형식으로 사용하는데 mat는 matrix object로써 여러 plot의 위치를 나타낸다. 다음 코드에서는 하나의 그림이 1열에 배치되고 두개의 그림은 2열에 배치된다.
# Figure 3.16
attach(mtcars)
layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE))
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)
결과는 그림 3.16과 같다.
4) 세밀한 그림 크기의 조절
경우에 따라 각 그림의 크기를 보다 정밀하게 조절하고 싶다면 layout() 함수의 옵션인 width= 와 height= 옵션을 사용할 수 있다. 다음과 같이 사용한다.
width=각 행의 넓이의 값을 갖는 벡터
height= 각 열의 높이의 값을 갖는 벡터
상대적인 width는 숫자로 표현되며 절대적인 width는(cm) 1cm()함수를 사용하여 표시한다.
다음의 코드에서 한개의 그림은 1열에 두개의 그림은 2열에 배치되지만 1열의 그림의 높이는 2열 높이의 1/3이며 아래열우측의 그림의 넓이는 아래열좌측 그림 넓이의 1/4이 된다.
# Figure 3.17
attach(mtcars)
layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE),
widths = c(3, 1), heights = c(1, 2))
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)
결과는 그림 3.17과 같다.
보는 것과 같이 layout()함수를 사용하면 최종 이미지 내의 그래프의 수와 배열, 그리고 상대적인 크기까지 조절할 수 있다. 보다 자세한 내용은 help(layout)을 이용해 보라.
5) 그림 배열의 미세 조절
경우에 따라 하나의 의미있는 그래프를 만들기 위해 여러개의 그림을 배열하거나 겹쳐서 그려야 할 경우가 있다. 그러기 위해서는 그림 배치의 미세 조절이 필요한데 fig=라는 그래픽인수를 사용하면 가능하다. 다음의 코드에서는 scatterplot 에 두개의 boxplot를 더해서 전체 그림을 완성했다. 그림 3.18에 그 결과가 있다.
# Listing 3.4 - Fine placement of figures in a graph
opar <- par(no.readonly = TRUE)
par(fig = c(0, 0.8, 0, 0.8)) # Set up scatter plot
plot(mtcars$wt, mtcars$mpg, xlab = "Miles Per Gallon",
ylab = "Car Weight")
par(fig = c(0, 0.8, 0.55, 1), new = TRUE) # Add box plot above
boxplot(mtcars$wt, horizontal = TRUE, axes = FALSE)
par(fig = c(0.65, 1, 0, 0.8), new = TRUE) # Add box plot to right
boxplot(mtcars$mpg, axes = FALSE)
mtext("Enhanced Scatterplot", side = 3, outer = TRUE,
line = -3)
par(opar)
이 그래프가 어떻게 만들어졌는지 이해하기 위해서는 전체 그래프의 왼쪽-아래코너를 (0,0)으로 생각하고 오른쪽-위를 (1,1)로 생각하자. 그림 3-19를 보면 이해에 도움이 될 것이다. fig=인수의 형식은 c(x1,x2,y1,y2) 형태의 숫자 벡터이다.
그림 3.19
LIST 3.4의 두번째 줄을 보면 fig=인수는 scatter plot 그래프를 화면 왼쪽 아래를 기준으로 x축위치는 0에서 0.8, y축위치도 0에서 0.8로 지정한다. 위쪽의 boxplot은 가로 위치는 0에서 0.8이고 세로 위치는 0.55에서 1이다. 오른쪽의 boxplot은 x축의 위치는 0.65에서 1이고 y축에서의 위치는 0에서 0.8이다.
그림 3.18을 그릴때 위쪽의 boxplt을 그릴때 0.8 대신 0.55를 사용한 이유는 boxplot이 scatterplot에 좀더 가깝게 하기 위해서이다. 마찬가지로 오른쪽 boxplot을 그릴떄에도 0.8이 아닌 0.65를 사용했다. 올바른 위치를 얻기 위해서는 여러번 숫자를 바꿔가며 실험해보라
첫댓글 위의 글은 제가 최근에 구한 R in Action이라는 책의 내용 중 일부를 옮긴 것입니다. 도움이 되셨다면 댓글을 부탁드립니다.
모아서 번역서를 내셔야 할 것 같네요. 통계하는 사람보다 의사선생님이 번역했다는 것이 다른 의사분들에게도 어필할 수 있을 것 같은데요.
보통 사람들이 그래프때문에 R을 시작하더라구요. 그런데 잘 그리기는 만만치 않더라구요. 가장 많이 쓰이는 그래프들을 쉽게 그리는 법을 연구하셔서 책으로 내셔도 될듯합니다.
아아.. 멋있습니다~
좋은정보항상 감사합니당~
좋은 글 감사합니다. 자주 사용하는 포맷을 저장해놓고... 데이터 넣었을때 딱 그려주면 좋은데...
R로는 구현을 잘 못하겠네요.... 저는 spotfire란 프로그램에서 trellis 기능을 이용합니다.
근데 spotfire 자체가 유료이니.... 집에서는 R로 잘 해봐야 겠네요...
ggplot도 책으로 같이 잠깐 보다 말았는데... 으윽 항상 꾸준히 뭔가 하기가... ㅠㅠ
이런 기능이 있을까? 라고 생각하고 있었는데 역시 R에서는 가능하군요! 정말 대단합니다!! 감사합니다.
R로 이렇게 그리는 것이 가능했군요! 논문에 이런 그림은 어떻게 그리나 궁금했었는데.. 감사합니다.^^
R로 그래프 그릴 때 항상 문제가 있었는데 이렇게 해결하면 되는군요!! 감사합니다! !