2023년 2월 13일 월요일

반쪽(dDDH) + 반쪽(ANI) heatmap 그려보기

며칠 전에 작성한 글(iTOL 그림 새로 그리기 - 최적의 genus delineation 방법은? 링크)에서 해양과기원 권개경 박사팀의 논문을 소개한 일이 있다. 여기에는 두 가지 자료(AAI와 ANI)를 하나의 heatmap으로 표시한 그림이 나온다. 

출처: Frontiers in Microbiology(그림 원본 링크)


다른 논문에서도 이런 스타일의 그림 또는 엑셀 시트(숫자에 따라 각 셀의 배경 색깔을 달리 한)을 종종 싣는 것 같았다. 특정 genus 내에 어떤 종이 있는지 유전체 수준에서 시각적으로 판단하기에 유용한 방법이다. 위에 소개한 논문에서는 AAI와 ANI를 사용하였지만, dDDH와 ANI를 쓴 사례도 있다(사례 1, 사례 2). 사례 2 논문의 그림 4 설명을 인용해 보자.

Boxed regions indicate inferred species based on comparisons that are at least 70% dDDH and 95% ANI, as well as monophyly in the genome-based phylogeny.

dDDH와 ANI가 각각 70%와 95% 이상인 조건을 동시에 만족시키면 같은 종으로 여기고 두꺼운 검정색 선의 사각형으로 둘러 놓았다. ANI threshold는 꼭 95%여야 하는가? 96%면 안되나? 그리고 내가 요즘 하는 작업(정확히 말하자면 2019년에 투고한 논문의 뒤늦은 수정 작업)에서는 이미 dRep(secondary clustering은 gANI를 사용하여 96.5% threshold 적용)으로 종 구별을 해 놓았는데 꼭 이런 보조적인 데이터 시각화를 해야 하는지 아직 확신은 서지 않는다. gANI는 유전체 염기서열 자체가 아니라 유전자의 orthologous pair를 대상으로 하는 ANI 계산으로서, 미국 DOE JGI에서 standalone 프로그램을 배포한다(링크). 

내가 알기로 이러한 희한한 heatmap을 한번에 그리는 간편한 방법은 없다. 이 heatmap에서는 대각선을 경계로 위 아래의 데이터 종류가 다르고, color scale도 다르다. 아마도 각각 별도의 heatmap을 그린 뒤 이미지 편집 프로그램에서 오려 붙인 것이 아닐까 한다. 혹은 R이나 파이썬 스크립트를 아주 절묘하게 작성하여 이런 그림을 그려 냈을지도 모르는 일이고...

나는 일단 R에서 두 매트릭스의 각 절반을 lower.tri() 및 upper.tri() 함수로 쪼개어서 합쳐 보았다. 이 일을 하기 전에는 dDDH 계산값을 reshape 라이브러리를 써서 매트릭스로 형태로 바꾸는 일부터 하였다. GGDC 웹사이트에서 제공하는 dDDH는 pair 형태로 얻어지기 때문이다.

ANI나 dDDH는 전부 퍼센트로 환산 가능하니 하나의 매트릭스로 만든 뒤 색을 표현해도 이상할 것은 없지만, 주로 나타나는 수치의 범위가 다르고 성격이 다른 계산값이므로 별도의 색상 체계로 나타내는 것이 합리적이다. 

또 다른 문제는 행과 열 자료의 dendrogram 표현이다. 매트릭스 내부의 자료를 클러스터링해서는 원하는 군집이 얻어지기 어렵다. 나의 경우는 ezTree를 사용하여 conserved protein sequence(concatenated)에 기반한 phylogenetic tree를 만든 뒤, 여기에서 나타난 taxon 순서를 이용하여 매트릭스를 재정렬하였다. 그러고 나서 heatmap.2() 함수에서 그림을 그릴 때는 클러스터링을 하지 않게 만들었다. 

그렇다면 외부에서 작성한 tree를 단지 '장식' 목적으로 heatmap 주변에 붙일 방법은 없을까? 정작 매트릭스 내부의 데이터와는 관계가 없는 tree를? 아마도 dendextend 라이브러리를 쓰면 자체 데이터의 클러스터링을 하지 않고 imported dendrogram에 기반한 클러스터링을 할 수 있을지 모르겠다. 

Heatmap의 대각선을 경계로 하여 color scale을 다르게 주는 것은 가능할까? 이를 해결하려면 이미지 편집 작업이 유일한 도구일 것인가? 내가 할 줄 아는 것은 PDF로 출력한 벡터 이미지를 Inkscape에서 매만지는 것 정도이다. 그리고 Inkscape 안에서 두 개의 heatmap을 대각선 경계로 나누어 하나로 붙이는 것도 보통 일은 아닐 것이다. 

R에서 heatmap을 다루는 방법을 좀 더 심도 있게 다루어 봐야 되겠다. 다음의 글에서는 내가 여태까지 모르던 라이브러리를 몇 개 더 소개하고 있다. 만날 gplots 라이브러리의 heatmap.2() 함수만 편식하던 습관을 고쳐 볼 필요가 있다. 예를 들어 ComplexHeatmap도 멋진 그림을 만들어 주는 것 같다.

Heatmap in R: Static and Interactive Visualization

댓글 없음: