2017년 12월 19일 화요일

[하루에 한 R] 그래픽스 생기초 - plot area와 margin 등의 이해

R GUI에서 그림을 그리면 기본적으로 정사각형의 창이 뜨면서 그림이 그려진다. 백문이 불여일견이니 한번 해 보자.
> plot(1:10)

창의 가장자리에 마우스를 대고 적당히 끌어서 크기와 종횡비(aspect ratio)를 조절한 다음 화면을 캡쳐하든지(해상도가 낮은 그림이라면 이 정도로도 무방), 혹은 마우스 오른쪽 버튼을 눌러서 나오는 팝업 메뉴에서 복사(메타파일 또는 비트맵)를 하거나 파일로 저장(메타파일 또는 eps)을 하면 된다. 메타파일로 복사를 하면 파워포인트에서 붙여넣기를 할 수 있다.

그런데 마우스로 드래그하여 조정한 상태를 유지하면서 다른 종류의 그래픽 파일(png, pdf...)로 출력하려면 어떻게 해야 하는가? 조정한 상태의 전체 크기와 마진이 얼마인지를 알아야 이것이 가능하다. 그러면 먼저 마진(margin)의 개념을 이해하도록 하자. 마진이란 위에서 보인 그림에서 네모로 둘러친 부분(내부는 plot region)을 둘러싼 바깥 네 부분의 여백을 뜻한다. 마진은 X-/Y-축 설명과 타이틀 등이 위치하는 곳이다. outer margin도 있지만 기본 크기는 0으로 정의된다.

기본적으로 생성되는 그래픽 창의 크기는 7 x 7인치이다. 이것을 어떻게 알아내는가? dev.size() 또는 dev.size("cm")라고 입력한 뒤 출력되는 값을 보면 된다. 앞의 것은 인치, 뒤의 것은 센티미터 단위이다. dev.new()를 입력하여 그래픽스 창을 하나 띄운 다음 마우스로 드래그하여 크기를 바꾼 뒤 dev.size()를 실행해 보라. 조정된 크기가 R prompt에 나타날 것이다.

만약 랜드스케이프 형태(레터 용지의 크기)의 그림을 얻고 싶다면 다음과 같이 하라. 단위를 mm 또는 cm로 바꾸는 방법도 어디엔가는 있을 것이다.
> dev.new(width=11.0,height=8.5) # letter landscape
> dev.new(width=11.692,height=8.267) #A4 landscape
Plot을 파일로 저장하려면 그래픽스 디바이스를 연 뒤 다음과 같이 하면 된다.
> png("file.png")
> plot(...)
> dev.off()
마진의 크기는 mar(단위는 라인) 또는 mai(단위는 인치) 벡터로 확인할 수 있으며, plot region의 크기는 pin(단위는 인치) 벡터로 같은 일을 할 수 있다. 마진 벡터의 각 원소는 plot의 아래쪽으로부터 시계방향으로 돌아가면서 크기를 나타낸다. 즉 아래, 왼쪽, 위, 오른쪽의 순서인 것이다. 7 x 7 인치의 기본 그래픽스 디바이스를 띄운 다음 마진과 plot region의 크기를 확인해 보자.
> graphics.off()
> par()$mar
[1] 5.1 4.1 4.1 2.1
> par()$mai
[1] 1.02 0.82 0.82 0.42
> par()$pin
[1] 5.759999 5.149582
그래픽스 화면을 드래그하면 이들 수치는 어떻게 될까? 일단 창 안에 그림이 있어야 하니 간단하게 plot(1:10)이라고 입력을 하여 플롯을 얻은 다음 마우스로 창의 크기를 이리저리 바꾸어 본다. 그 다음에 par()$mai와 par()$pin을 각각 입력해 보라. 어떤가? 마진은 그대로이지만 plot region의 크기를 나타내는 pin의 값은 변했다. 실제 마우스로 그림의 크기를 변화시키면 마진의 크기, 글꼴, 라벨 등은 그대로인데 plot region 내부만 변형이 됨을 알 수 있다. 즉 마진의 설정이 우선하는 것으로 생각하면 된다. 그림을 너무 작게 줄여서 위 아래 마진의 합이 그림의 높이보다 큰 상태가 되면(좌우 마진도 마찬가지) ""figure margins too large"라는 메시지가 그래픽 디바이스 창에 나타난다. 그림을 줄여도 마진 영역은 그대로 지켜야 하니 plot region이 확보되지 않음을 의미하는 것이다.

마구 조정을 한 다음의 그림 전체 크기는 얼마일까? par()$fin으로 확인 가능하다. 그래픽스 디바이스를 끈 다음 다음의 명령을 실행해 보자. 기본 그래픽스 창의 크기를 표시할 것이다.
> par()$fin
[1] 6.999999 6.989582
그렇다. 대략 7 x 7인치에 해당하는 것이다. 이상의 작업을 통해서 내가 그리려는 적절한 그림의 크기와 마진을 알아냈다고 가정하자. 그러면 이를 par() 함수에 설정해 넣으면 된다. 마진의 기본 크기는 (5,4,4,2) + 0.1이다(단위는 인치가 아님). 다음의 예제에서는 크기와 마진을 임의로 설정한 플롯을 그려서 pdf 파일에 출력하는 방법을 보여주고 있다.
pdf("test.pdf",width=11,height=8.5)
par(mai=c(4,4,2,2))
plot(1:10,xlab="x label",ylab="y label",main="Main title",sub="sub title")
dev.off()
빨간 숫자는 마진의 크기를 나타낸다.

ggplot2를 쓰면 화려한 그림을 통해서 복잡한 데이터에 숨은 의미를 찾는 길이 더욱 쉬워진다. 그렇다 하더라도 plot의 크기와 마진에 대한 기본적인 조작 방법을 파악하는 것도 중요하다. 

gplots에서 heatmap.2() 레이아웃 변경


Moving color key in R heatmap.2를 참조하면 color key의 위치와 크기를 변경할 수 있다. Row 및 Col label을 잘 보이게 하려면 cexRow/cexCol 인수를 줄이는 것도 좋지만 heatmap.2(x, margins=c(5,20))과 같이 margins 인수를 써도 된다. 앞의 것은 바닥 마진, 뒤의 것은 오른쪽 마진의 크기이다. heatmap.2()로 만들어진 그림은 마우스를 대고 드래그를 한다고 해서 마진 부분이 늘어나서 가려졌던 라벨이 보이거나 하지는 않는 것 같다.

참고 사이트


댓글 없음: