Friday, September 23, 2011

R multiple plots in same window

맨날 까먹어.. 난.. 인터넷이 폐해인가? 아님 내가 원래 붕어인건가?




check point 1
"par 함수의 사용"


일단은 한 윈도우 안에 여러 그림을 그릴려면 par 라는 함수를 사용해야 하고 이건 뭐하는 거냐 하면 query for graphical parameter. 각종 device 마다의 parameter가 있는데 이걸 par 함수의 attribute라고 해야 하나 옵션이라고 해야 하나.. 이런 것들을 이용해서 query로 던지는 것. 특히 mfrow(or mfcol)과 fig 옵션을 사용하면 각 plot의 위치와 범위를 선정 할 수 있다. 다음의 사이트와 블로그에 잘 설명이 되어 있는데 간략하게 설명하자면 


par(mfrow=c(2,2)) #multiple figures by row로 multiple plot이 몇 x by x 인지 또 각 plot들어가는 순서를 나타낸다.
par(fig=c(0,0.3,0.5,1)) #앞의 두 vector는 x 축의 coordinate, 뒤 두 vector는 y 축의 coordinate를 의미하는 것으로 0과 1 사이 값을 갖게 된다.아래 그림 참조
plot(somthing) # par의 fig로 영역을 잡은 곳에 그림을 그림


%아래 그림은 "불탄五징어" 님 블로그에서 발췌함을 밝힌다.%
그런데 여기서 fig의 coordinate의 기준이 어디냐? 아래 그림을 보면 NDC space가 fig가 따르는 체계(?)이다. 다음 참조




check point 2
"heat map 그리기"


사실 이건 multiple plot이랑 상관없지만 또 잊어버릴까봐 기록한다.




check point 3
"histogram horizontal"


hist 자체에는 horiz 이라는 parameter가 없는데 이를 해결하는 것이 hist의 return 값을  barplot을 이용하여 그리는 것. 근데 문제가 y축의 label을 쓰는 것이 생각보다 골치 아픈데.. 다음을 참조하면 해결 가능해진다.


h.temp = hist(something$value, plot=FALSE) #plot 옵션을 F로 줘서 그림은 그리지 않은채 hist의 return 값만 받는다.
barplot(h.temp$count, space=0,horiz=TRUE) #space는 hist가 원래 space가 0이므로 가능한 비슷하게 그리기 위해 준 옵션이고 horiz를 통해서 rotated hist를 그린다.
labels = h.temp$breaks #y축에 label을 할 숫자들
text(par('usr')[1]-3,1:length(labels)-1,srt=90,adj=0.5,labels=labels,xpd=T) #첫 두 숫자는 x,y의 coordinate로 label의 갯수만큼 vector를 생성해야 한다(여기의 경우 y vector를 label수 만큼 지정했기 때문에 x 축의 값은 하나라도 반복되서 적용). srt는 label의 글씨를 90도 기울인 것이고 adj는 label의 가운데와 tick과 정렬시키는 것. 


Conclusion
결국 내가 하려던 것은 The DNA methylome of Human Peripheral Blood Mononuclear Cells에 나오는 figure를 그리고 싶었던 것인데.. 최종 코드는 아래와 같다.