User Tools

Site Tools


data_visualization

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
data_visualization [2018/07/18 13:35] – [매트릭스 형태의 텍스트 파일을 R에서 읽어들이기(2)] hyjeongdata_visualization [2023/02/15 10:43] (current) – [Heatmap 그림과 phylogenetic tree의 결합] hyjeong
Line 6: Line 6:
 ==== 유용한 링크들 ==== ==== 유용한 링크들 ====
  
-  * [정해영의 블로그] [[http://blog.genoglobe.com/2015/04/r.html|매트릭스 형태의 텍스트 파일 입력과 헤더의 처리]] **(중요함!)**+  * [정해영의 블로그] [[http://blog.genoglobe.com/2015/04/r.html|매트릭스 형태의 텍스트 파일 입력과 헤더의 처리]] **(중요함!)** - 첫 줄의 컬럼 수가 나머지보다 하나 적으면 header=T,row.names=1 파라미터가 필요없다는 것을 기억해 두면 편리하다.
   * [정해영의 블로그] [[http://blog.genoglobe.com/2017/12/blast-score-ratiobsr.html|BLAST score ratio(BSR)을 이용한 유전체 비교 분석]] - BSR의 개념 소개   * [정해영의 블로그] [[http://blog.genoglobe.com/2017/12/blast-score-ratiobsr.html|BLAST score ratio(BSR)을 이용한 유전체 비교 분석]] - BSR의 개념 소개
   * [[https://bacpathgenomics.wordpress.com/2012/05/25/displaying-data-associated-with-phylogenetic-trees/|Displaying data associated with phylogenetic trees]]   * [[https://bacpathgenomics.wordpress.com/2012/05/25/displaying-data-associated-with-phylogenetic-trees/|Displaying data associated with phylogenetic trees]]
Line 16: Line 16:
  
 ==== 매트릭스 형태의 텍스트 파일을 R에서 읽어들이기(1) ==== ==== 매트릭스 형태의 텍스트 파일을 R에서 읽어들이기(1) ====
-LS-BSR이 생성하는 결과 파일 중 하나인 **ls-bsr_out_bsr_matrix.txt**의 구조는 다음과 같다. 이 그림은 ooffice --calc <file>로 연 것을 캡쳐한 화면이다. 각 컬럼은 유전체, 행은 48개의 유전체에서 예측한 유전자(단백질로 번역)를 클러스터링한 뒤 추출된 대표 유전자들의 ID이다. 그러니 row의 수가 2만개가 넘는다.+Marker gene을 제공하지 않고 LS-BSR을 실행했을 때 만들어지는 결과 파일 중 하나인 **ls-bsr_out_bsr_matrix.txt**의 구조는 다음과 같다. 이 그림은 ooffice --calc <file>로 연 것을 캡쳐한 화면이다. 각 컬럼은 유전체, 행은 48개의 유전체에서 예측한 유전자(단백질로 번역)를 클러스터링한 뒤 추출된 대표 유전자들의 ID이다. 그러니 row의 수가 2만개가 넘는다. 다시말해서 48개 미생물에 대해서 계산을 통해 pangenome을 얻었고, 이를 구성하는 모든 유전자가 row에 자리잡았다는 뜻이다.
  
 {{ :bsr_matrix.png?400 |}} {{ :bsr_matrix.png?400 |}}
Line 36: Line 36:
      
  
-=== 컬럼의 배열 순서 바꾸기 ===+=== 컬럼의 배열 순서 뒤집기 ===
 marker gene(g<sub>1</sub>, g<sub>2</sub>, g<sub>3</sub>,... g<sub>n</sub>)을 사용하여 LS-BSR을 실행한 뒤 OUT_bsr_matrix.txt(OUT은 -x OUT으로 설정)을 열어보니 g<sub>n</sub>, g<sub>n-1</sub>, g<sub>n-2</sub>,... g<sub>1</sub> 순서로 row가 배열되어 있었다. t() 함수를 써서 이를 컬럼 단위로 배열하면 원래 의도했던 유전자의 역순이라서 불편하다. 만약 컬럼의 배열 순서를 역으로 바꾸고 싶다면 다음과 같이 하라. marker gene(g<sub>1</sub>, g<sub>2</sub>, g<sub>3</sub>,... g<sub>n</sub>)을 사용하여 LS-BSR을 실행한 뒤 OUT_bsr_matrix.txt(OUT은 -x OUT으로 설정)을 열어보니 g<sub>n</sub>, g<sub>n-1</sub>, g<sub>n-2</sub>,... g<sub>1</sub> 순서로 row가 배열되어 있었다. t() 함수를 써서 이를 컬럼 단위로 배열하면 원래 의도했던 유전자의 역순이라서 불편하다. 만약 컬럼의 배열 순서를 역으로 바꾸고 싶다면 다음과 같이 하라.
  
   > data2_r = data3[,ncol(data2):1]   > data2_r = data3[,ncol(data2):1]
  
 +=== 컬럼의 배열 순서를 임의로 바꾸기 ===
 +myord라는 벡터를 하나 생성하여 컬럼 이름을 여기에 순서대로 넣는다. 그리고 다음과 같이 하면 그만이다. 이는 row에 대해서도 똑같이 적용할 수 있다. 이렇게 쉬운 것을 모르고 for 구문을 쓸 궁리를 하다니!
 +  > data_new = data3[, myord]
  
 === 특정 row만을 뽑아내어 후속 분석에 사용하고 싶다면 === === 특정 row만을 뽑아내어 후속 분석에 사용하고 싶다면 ===
Line 57: Line 60:
 ==== 테이블 병합하기 ==== ==== 테이블 병합하기 ====
 <key>,<value>를 여러 row에 걸쳐 수록한 텍스트 파일이 N 개 존재한다고 가정하자. 이를 R에서 데이터프레임으로 한꺼번에 읽어들인 뒤 key를 기준으로 병합하는 방법을 알아보자. 최종 결과물은 <key>,<value 1>,<value 2>,<value 3>,...<value N> 형식이 되기를 원하는 것이다. 예를 들자면 여러 FASTA 파일을 phylosift로 분석하여 각 샘플에 대해 동정된 마커의 수를 수록한 marker_summary.txt를 하나로 병합하는 것이다. 이에 대해서는 [[http://blog.genoglobe.com/2018/01/r-phylosift-tab-delimited-csv.html|[정해영의 블로그] PhyloSift 결과 종합하기(tab-delimited CSV 파일의 일괄 입력 및 병합 등)]]에서 자세히 다루었다. <key>,<value>를 여러 row에 걸쳐 수록한 텍스트 파일이 N 개 존재한다고 가정하자. 이를 R에서 데이터프레임으로 한꺼번에 읽어들인 뒤 key를 기준으로 병합하는 방법을 알아보자. 최종 결과물은 <key>,<value 1>,<value 2>,<value 3>,...<value N> 형식이 되기를 원하는 것이다. 예를 들자면 여러 FASTA 파일을 phylosift로 분석하여 각 샘플에 대해 동정된 마커의 수를 수록한 marker_summary.txt를 하나로 병합하는 것이다. 이에 대해서는 [[http://blog.genoglobe.com/2018/01/r-phylosift-tab-delimited-csv.html|[정해영의 블로그] PhyloSift 결과 종합하기(tab-delimited CSV 파일의 일괄 입력 및 병합 등)]]에서 자세히 다루었다.
 +
 +그런데 모든 텍스트 파일의 key가 동일한 set이 아니라면 위에서 소개한 방법으로는 잘 되지 않을 것이다.
 ==== 매트릭스 형태의 텍스트 파일을 R에서 읽어들이기(2) ==== ==== 매트릭스 형태의 텍스트 파일을 R에서 읽어들이기(2) ====
 이번에는 [[https://github.com/widdowquinn/pyani|pyani]]를 사용하여 만든 ANI matrix를 가공하여 특정한 컬럼만을 추출하는 방법을 공부해 본다. 원래 이 일은 iTOL에 업로드하여 phylogenetic tree 옆에 ANI heatmap을 그려넣기 위하여 시작한 것이다. 서로 밀접하게 관련된 몇 개의 speies에서 유래한 51개의 스트레인의 유전체 서열을 사용하여 ANI 계산을 한 뒤, 5개의 type strain에 대한 ANI 값만을 뽑아내어 51 x 5 매트릭스를 만들고자 한다. 이 작업은 생각보다 복잡하였다. 컬럼 네임을 이용하여 특정 컬럼만을 뽑아내는 column slice 작업은 간단하지만 컬럼 이름을 바꾸고 user defined order로 정렬하는 것은 쉽지 않았다. 그러나 최종 구현된 코드는 매우 단순하다. 만약 dplyr 패키지를 사용한다면 좀 더 논리적인 접근이 가능할 것이나, 되도록 R base package를 써 보자는 것이 나의 철학이다. 이번에는 [[https://github.com/widdowquinn/pyani|pyani]]를 사용하여 만든 ANI matrix를 가공하여 특정한 컬럼만을 추출하는 방법을 공부해 본다. 원래 이 일은 iTOL에 업로드하여 phylogenetic tree 옆에 ANI heatmap을 그려넣기 위하여 시작한 것이다. 서로 밀접하게 관련된 몇 개의 speies에서 유래한 51개의 스트레인의 유전체 서열을 사용하여 ANI 계산을 한 뒤, 5개의 type strain에 대한 ANI 값만을 뽑아내어 51 x 5 매트릭스를 만들고자 한다. 이 작업은 생각보다 복잡하였다. 컬럼 네임을 이용하여 특정 컬럼만을 뽑아내는 column slice 작업은 간단하지만 컬럼 이름을 바꾸고 user defined order로 정렬하는 것은 쉽지 않았다. 그러나 최종 구현된 코드는 매우 단순하다. 만약 dplyr 패키지를 사용한다면 좀 더 논리적인 접근이 가능할 것이나, 되도록 R base package를 써 보자는 것이 나의 철학이다.
Line 69: Line 74:
   > rownames(data) = data[,1]   > rownames(data) = data[,1]
   > data = data[,-1]   > data = data[,-1]
-  # 또는 data = read.table("ANIb_percentage_identity.tab",sep="\t",header=T,row.names=1)+  # 사실 위의 세 줄은 지극히 초보적인 방법이다. 다음 한 줄이면 족하다. 
 +  # data = read.table("ANIb_percentage_identity.tab",sep="\t",header=T,row.names=1)
   > #View(data)   > #View(data)
   # 대각선에 대하여 대칭인 구조이지만 query -> subject 방향에 따라 identity가 똑같지 않다.   # 대각선에 대하여 대칭인 구조이지만 query -> subject 방향에 따라 identity가 똑같지 않다.
Line 95: Line 101:
 {{ :매트릭스-2.png?400 |}} {{ :매트릭스-2.png?400 |}}
 ==== gplots 패키지의 heatmap.2() 함수 이용 ==== ==== gplots 패키지의 heatmap.2() 함수 이용 ====
 +[[https://www.rdocumentation.org/packages/gplots/versions/3.0.1/topics/heatmap.2|heatmap.2 documentation]]
   > library(gplots)   > library(gplots)
   > heatmap.2(as.matrix(data4),col=greenred(10),trace="none",scale="none",dendrogram=c("row"))   > heatmap.2(as.matrix(data4),col=greenred(10),trace="none",scale="none",dendrogram=c("row"))
Line 104: Line 111:
 다음은 레이아웃을 변경하는 예제이다. 여러가지 방법으로 응용해 보라. 가장 유용한 인수 설정은 density.info="none"였다. 이를 적용하면 Color Keys and Histogram(두 줄)이 Color Key로 바뀌면서 텍스트 라벨과 컬러 키가 닿는 불편한 모습이 사라진다. 다음은 레이아웃을 변경하는 예제이다. 여러가지 방법으로 응용해 보라. 가장 유용한 인수 설정은 density.info="none"였다. 이를 적용하면 Color Keys and Histogram(두 줄)이 Color Key로 바뀌면서 텍스트 라벨과 컬러 키가 닿는 불편한 모습이 사라진다.
   > heatmap.2(as.matrix(d2),col=greenred(10),trace="none",scale="none",dendrogram=c("row"),cexCol=1,cexRow=0.2,margins=c(5,20),lhei=c(1,5),density.info="none")   > heatmap.2(as.matrix(d2),col=greenred(10),trace="none",scale="none",dendrogram=c("row"),cexCol=1,cexRow=0.2,margins=c(5,20),lhei=c(1,5),density.info="none")
 +색상 체계가 마음에 들지 않는다면 다음과 같이 팔레트를 자체 정의할 수 있다.
 +  > my_palette = colorRampPalette(c("turquoise", "yellow", "red"))(n = 100)
 +  > heatmap.2(x, col=my_palette,...)
 +heatmap.2()로 그려지는 plot의 각 요소(heatmatp, row dendrogram, column dendrogram, key)의 위치와 크기를 조절하는 방법은 다음을 참조하라.
 +  * [[https://stackoverflow.com/questions/15351575/moving-color-key-in-r-heatmap-2-function-of-gplots-package heatmap.2 |Moving color key in R heatmap.2 (function of gplots package)]]
  
 === Label에 색깔 입히기 === === Label에 색깔 입히기 ===
-Row label에 쓰인 값들을 사전에 특별한 규칙에 의해서 그룹으로 묶어 두었다고 가정하자. 실제로 heatmap에서 dendrogram으로 묶이는 것과는 어떤 차이가 있을까? Row label에 그룹별로 색깔을 입힐 수 있다면 가능하다. key_info.txt 파일을 준비하여 다음과 같은 정보를 기록하라. 여기에서는 4개 컬럼으로 구성하여 첫번째가 key, 네번째가 color인 것으로 정하였으나 이는 사용자 맘대로이다.+Row label에 쓰인 값들을 사전에 특별한 규칙에 의해서 그룹으로 묶어 두었다고 가정하자. 실제로 heatmap에서 dendrogram으로 묶이는 것과는 어떤 차이가 있을까? Row label에 그룹별로 색깔을 입힐 수 있다면 가능하다. key_info.txt 파일을 준비하여 다음과 같은 정보를 기록하라. 여기에서는 4개 컬럼으로 구성하여 첫번째가 key, 네번째가 color인 것으로 정하였으나 이는 사용자 맘대로이다. 다음을 a 라는데이터프레임에 저장하였다고 가정하자.
   key1   info1-a   info1-b   black   key1   info1-a   info1-b   black
   key2   info2-a   info2-b   red   key2   info2-a   info2-b   red
   key3   info3-a   info3-b   blue   key3   info3-a   info3-b   blue
  
 +색깔에 해당하는 컬럼을 cols = a[,4] 명령으로 슬라이스한 뒤 heatmap.2(x,...,colRow=cols,) 함수를 사용하면 된다. 단, key_info.txt와 데이터프레임 x 내부에서 key는 같은 순서로 존재해야 한다. R에서 사용 가능한 컬러에 대해서는 [[https://www.nceas.ucsb.edu/~frazier/RSpatialGuides/colorPaletteCheatsheet.pdf|R color cheetsheet]]를 참조하라. R에는 총 657개의 내장 색상을 갖고 있으며 colors() 명령으로 이를 확인할 수 있다.
  
 ==== Heatmap 그림과 phylogenetic tree의 결합 ==== ==== Heatmap 그림과 phylogenetic tree의 결합 ====
Line 119: Line 132:
   > d = read.table("matrix_pyani.tab",sep="\t",header=T,row.names=1)   > d = read.table("matrix_pyani.tab",sep="\t",header=T,row.names=1)
   > fit = hclust(dist(as.matrix(d)),method="average")   > fit = hclust(dist(as.matrix(d)),method="average")
 +  # heatmap.2() 함수는 complete agglomeration method를 클러스터링에 사용한다. average method는 UPGMA와 같다.
   > my_tree=as.phylo(fit)   > my_tree=as.phylo(fit)
   > write.tree(phy=my_tree,file="test.newick")   > write.tree(phy=my_tree,file="test.newick")
Line 124: Line 138:
 [[https://stackoverflow.com/questions/21727820/how-to-create-a-newick-file-from-a-cluster-in-r|How to create a newick file from a cluster in R?]] [[https://stackoverflow.com/questions/21727820/how-to-create-a-newick-file-from-a-cluster-in-r|How to create a newick file from a cluster in R?]]
  
-그 반대로, 다른 도구를 통해 만든 tree를 heatmap.2() 함수에 공급할 방법은 없을까? 내가 알기로 그것은 불가능하고, 아래에서 소개할 iTOL을 이용하는 것이 바람직하다. 물론 이것이 유일한 방법은 아니다.+그 반대로, 다른 도구를 통해 만든 tree를 heatmap.2() 함수에 공급할 방법은 없을까? 내가 알기로 그것은 불가능하고, 아래에서 소개할 iTOL을 이용하는 것이 바람직하다. 물론 이것이 유일한 방법은 아니다. 바로 [[https://jokergoo.github.io/ComplexHeatmap-reference/book/|ComplexHeatmap 라이브러리]]가 있다.  
 + 
 +다음은 보다 상세한 heatmap 작성 관련 기술 문서이다. 
 + 
 +[[https://www.datanovia.com/en/lessons/heatmap-in-r-static-and-interactive-visualization/|Heatmap in R: Static and interactive visualization]] - heatmap(), heatmap.2(), interactive heatmap using 3dheatmap(), complexheatmap...
 ===== iTOL 이용하기 ===== ===== iTOL 이용하기 =====
 [[https://jonasjacek.github.io/colors/|256 color cheat sheet]] [[https://jonasjacek.github.io/colors/|256 color cheat sheet]]
data_visualization.1531888500.txt.gz · Last modified: (external edit)