본문 바로가기
기본적인프로그래밍/R

[R] RColorBrewer 이용해서 색감을 확인해보자. (feat. pheatmap)

by 인포메틱스 2021. 12. 21.
반응형

논문이나 보고서를 쓸때 heatmap을 그릴 때가 있습니다.

 

그럴때마다 항상 고민인 것은 Annotation color를 지정하는것입니다.

 

이번 포스팅은 RColorBrewer를 이용해서 쉽게 색감들의 이름을 확인해보고자 합니다.

 

먼저 연습 데이터로 Annotation color를 사용하는 heatmap을 그려보겠습니다.

 

연습데이터는 ggplot2에 있는 diamonds 데이터를 이용하겠습니다.

 

library(ggplot2)
library(pheatmap)
data(diamonds)
diamonds<-diamonds[1:1000,] # 데이터가 5만개정도니 줄여줍니다.
diamonds<-as.data.frame(diamonds)
diamond_mat<-diamonds[,5:ncol(diamonds)]

rownames(diamond_mat)<-paste0('dia-',c(1:nrow(diamond_mat)))
dia_anot<-diamonds[,2:4]
rownames(dia_anot)<-paste0('dia-',c(1:nrow(diamond_mat)))

# scale없이 그리게 되면 그럴싸한 그림이 안나옵니다.
pheatmap(diamond_mat,annotation_row = dia_anot,scale = 'column')

 

heatmap은 대충 어느정도 잘 보이는데, Annotation color 즉 clarity, color, cut 을 나타내는 색감이 뭔가 마음에 안든다고 가정을 합시다.

 

색감을 변경하고 싶을 때 자주 사용하는 package는 RColorBrewer입니다.

 

먼저 package에 어떤 값들이 있는지 확인해봅시다.

 

library(RColorBrewer)
display.brewer.all()

다음과 같이 추천해주는 색감들을 확인해보니 다음과 같습니다. (display.brewer.all function의 help에 예시를 보면 다양하게 색을 확인할수가 있습니다.)

 

 예시로 clarity는 RdGy로 하고, color는 Spectral로 하고, cut는 RdYlGn으로 변경해보겠습니다.

 

clarity=brewer.pal(length(levels(dia_anot$clarity)),'RdGy')
names(clarity)=levels(dia_anot$clarity)

color=brewer.pal(length(levels(dia_anot$color)),'Spectral')
names(color)=levels(dia_anot$color)

cut=brewer.pal(length(levels(dia_anot$cut)),'RdYlGn')
names(cut)=levels(dia_anot$cut)

annot_col<-list(clarity=clarity,color=color,cut=cut)
pheatmap(diamond_mat,annotation_row = dia_anot,annotation_colors = annot_col,scale = 'column')

위 처럼 진행을 하게되면 다음과 같이 annotation color가 변경이 됩니다.

 

 

생각보다 예쁘게 안되었네요... (뭐 이렇게 진행하면 됩니다.)

 

이렇게 RColorBrewer를 이용하여 annotation color를 변경해보았고, 한가지 팁을 드리자면, color들을 자세히 보기 위해서 다음과 같이 진행하면 됩니다.

 

# RdGy color를 8개로 나눠서 확인
display.brewer.pal(8,'RdGy')
text(1:8,1,brewer.pal(8,'RdGy'))

위 처럼 내가 지정한 색들의 이름을 알수가 있고, 실제 색감들을 확인할 수가 있습니다.

 

그렇기 때문에 heatmap을 그린다거나, 혹은 scatter plot, barplot 등 다양한 plot에 그림을 그릴때 색을 확인해보면서 그릴 수가 있습니다.

 

 

728x90
반응형

댓글