2023년 2월 21일 화요일

[하루에 한 R] ComplexHeatmap에서 특정 row label을 볼드로 표시하기

미생물 균주의 ANI와 dDDH를 절반씩 혼합한 매트릭스를 만든 뒤 균주 이름을 표시한 row label 중 type strain에 해당하는 것을 bold로 표현하기 위한 방법을 찾아 보았다. 다음의 글은 pheatmap 패키지를 사용한 것으로서 함수 구조가 비슷한 ComplexHeatmap 환경에서도 적용할 수 있었다.

[Stack Overflow] How to label some rowname of heatmap in bold and other in italic



이 함수를 변형하여 원하는 바를 달성하기는 했지만 %>%(chain operator), walk(), bquote(), as.expression() 등 내가 거의 쓰지 않는 구문을 사용하고 있어서 완벽하게 이해하기 어려웠다. 특히 그림을 그릴 매트릭스(실제로는 데이터프레임)의 row 및 column 이름은 단순한 genome assembly accession(GCF_#########.#)이고, heatmap 그림에서는 이를 풀어서 균주의 구체적인 이름(예: Paenibacillus polymyxa E681)으로 나타내야 하기 때문에 기본 예제에 대해 손을 댈 곳이 많았다.

ComplexHeatmap의 개발자는 gridtext라는 것을 사용하여 heatmap에 표현되는 텍스트의 여러 속성을 제어하는 방법을 설명하였다(링크). Heatmap() 함수의 인자에  row_names_gp = gpar(fontface = vector)를 지정하면 된다. vector는 c("plain", "bold", "italic", "bold.italic"...)의 형태로 주어진다. 10.3.2 Row/column names 서브섹션에 실제 활용 사례가 나온다.

내가 사용한 코드를 약간 단순하게 정리하면 대략 다음과 같다. 데이터프레임의 column/row label과 실제로 heatmap에서 표시하고 싶은 균주 이름을 accession-label.csv라는 별도의 텍스트 파일로 마련한 다음 R에서 읽어들여 key라는 named vector를 만들었다. ff_vector는 각 row label의 표시 방식(plain, bold...)를 담고 있다. 클러스터링은 dend라는 외부 자료를 기준으로 실행한다는 것도 중요하다. dend는 phylo가 아니라 dendrogram class여야 함에 유의하자. 나에게는 Heatmap() 함수를 실행하기 전의 코드 조각이 더 유용한 것 같다. 트리를 나눈 뒤 각 클레이드의 가지를 다른 색깔로 표시하고 heatmap도 이에 따라 분리해 놓는 방법에 대해서는 아래 코드에 기재하지 않았다. Legend의 커스터마이제이션도 마찬가지로 표시하지는 않았다.

# 균주 정보를 담은 named vector "key" 생성하기
data = read.table("accession-label.csv", sep=",", stringsAsFactors=F)
key = data[,2] # "GCF_000146875.3 Paenibacillus polymyxa E681"
names(key) = data[,1] # "GCF_000146875.3"

type_strain_acc = c("GCF_000000000.1", "GCF_111111111.1", "GCF_222222222.1")

n = length(rownames(total))
ff_vector = rep("plain", n)

for (i in 1:n) {
   if (rownames(total)[i] %in% type_strain_acc) {
      ff_vector[i] = "bold"
   }
}

ht = Heatmap(as.matrix(total), row_labels = key[rownames(total)],
        cluster_rows = dend, cluster_columns = dend, col = col_rnorm,
        row_title = "ANI", column_title = "dDDH", 
        row_names_gp = gpar(fontsize = 8, fontface = ff_vector), 
        column_names_gp = gpar(fontsize = 8),
        )
draw(ht)

부득이하게 column/row label을 "블러" 처리하였다.


약 일주일에 걸쳐서 무궁무진하고 다채로운 ComplexHeatmap 세계의 아주 좁은 구석을 돌아다녀 보았다. 덩달아서 한참 동안이나 손을 놓고 있었던 R 기능의 세부적인 사항을 공부하는 아주 좋은 계기가 되었음은 두말할 나위도 없다. 이렇게 멋진 패키지를 개발한 "bioinformagician" Zuguang Gu에게 무한한 감사의 뜻을 전한다.

댓글 없음: