R語言學習 - 熱圖簡化

繪製熱圖除了使用ggplot2,還能夠有其它的包或函數,好比pheatmap::pheatmap (pheatmap包中的pheatmap函數)、gplots::heatmap.2等。
 
相比於ggplot2做heatmap, pheatmap會更爲簡單一些,一個函數設置不一樣的參數,能夠完成行列聚類、行列註釋、Z-score計算、顏色自定義等。
data_ori <- "Grp_1;Grp_2;Grp_3;Grp_4;Grp_5
a;6.6;20.9;100.1;600.0;5.2
b;20.8;99.8;700.0;3.7;19.2
c;100.0;800.0;6.2;21.4;98.6
d;900;3.3;20.3;101.1;10000"
 
data <- read.table(text=data_ori, header=T, row.names=1, sep=";", quote="")
  Grp_1 Grp_2 Grp_3 Grp_4   Grp_5
a   6.6  20.9 100.1 600.0     5.2
b  20.8  99.8 700.0   3.7    19.2
c 100.0 800.0   6.2  21.4    98.6
d 900.0   3.3  20.3 101.1 10000.0
pheatmap::pheatmap(data, filename="pheatmap_1.pdf")
雖然有點醜,但一步就出來了。
 
此外Z-score計算在pheatmap中只要一個參數就能夠實現。
pheatmap::pheatmap(data, scale="row", filename="pheatmap_1.pdf")
有時可能不須要行或列的聚類,原始展現就能夠了。
pheatmap::pheatmap(data, scale="row", cluster_rows=FALSE, cluster_cols=FALSE, filename="pheatmap_1.pdf")
給矩陣 (data)中行和列不一樣的分組註釋。假若有兩個文件,第一個文件爲行註釋,其第一列與矩陣中的第一列內容相同 (順序沒有關係),其它列爲第一列的不一樣的標記,以下面示例中(假設行爲基因,列爲樣品)的2,3列對應基因的不一樣類型 (TF or enzyme)和不一樣分組。第二個文件爲列註釋,其第一列與矩陣中第一行內容相同,其它列則爲樣品的註釋。
row_anno = data.frame(type=c("TF","Enzyme","Enzyme","TF"), class="c"("clu1","clu1","clu2","clu2"), row.names=rownames(data))
row_anno
    type class
a     TF  clu1
b Enzyme  clu1
c Enzyme  clu2
d     TF  clu2
col_anno = data.frame(grp=c("A","A","A","B","B"), size=1:5, row.names=colnames(data))
col_anno
      grp size
Grp_1   A    1
Grp_2   A    2
Grp_3   A    3
Grp_4   B    4
Grp_5   B    5
pheatmap::pheatmap(data, scale="row", 
cluster_rows=FALSE, 
annotation_col=col_anno,
annotation_row=row_anno,
filename="pheatmap_1.pdf")
自定義下顏色吧。
# <bias> values larger than 1 will give more color for high end. 
# Values between 0-1 will give more color for low end.
pheatmap::pheatmap(data, scale="row", 
cluster_rows=FALSE, 
annotation_col=col_anno,
annotation_row=row_anno,
color=colorRampPalette(c('green','yellow','red'), bias=1)(50),
filename="pheatmap_1.pdf")
不改腳本的熱圖繪製
繪圖時一般會碰到兩個頭疼的問題:
  1. 須要畫不少的圖,惟一的不一樣就是輸出文件,其它都不須要修改。若是用R腳本,須要反覆替換文件名,繁瑣又容易出錯。
  2. 每次繪圖都須要不斷的調整參數,時間久了不用,就忘記參數放哪了;或者調整次數過多,有了不少版本,最後不知道用哪一個了。
爲了簡化繪圖、維持腳本的一致,我用bash對R作了一個封裝,而後就能夠經過修改命令參數繪製不一樣的圖了。
 
先看一看怎麼使用
首先把測試數據存儲到文件中方便調用。數據矩陣存儲在heatmap_data.xls文件中;行註釋存儲在heatmap_row_anno.xls文件中;列註釋存儲在heatmap_col_anno.xls文件中。
# tab鍵分割,每列不加引號
write.table(data, file="heatmap_data.xls", sep="\t", row.names=T, col.names=T, quote=F)
# 若是看着第一行少了ID列不爽,能夠填補下。-i參數直接對文件進行操做,1 指定第一行。在行首添加製表符
system("sed -i '1 s/^/ID\t/' heatmap_data.xls")

write.table(row_anno, file="heatmap_row_anno.xls", sep="\t", row.names=T, col.names=T, quote=F)
write.table(col_anno, file="heatmap_col_anno.xls", sep="\t", row.names=T, col.names=T, quote=F)
而後用程序sp_pheatmap.sh繪圖。
# -f: 指定輸入的矩陣文件
# -d:指定是否計算Z-score,<none> (否), <row> (按行算), <col> (按列算)
# -P: 行註釋文件
# -Q: 列註釋文件
$ sp_pheatmap.sh -f heatmap_data.xls -d row -P heatmap_row_anno.xls -Q heatmap_col_anno.xls
一個回車就獲得了圖,字有點小,是由於圖太大了,把圖的寬和高縮小下試試。
# -u: 設置寬度,單位是inch
# -v: 設置高度,單位是inch
$ sp_pheatmap.sh -f heatmap_data.xls -d row -P heatmap_row_anno.xls -Q heatmap_col_anno.xls -u 8 -v 12
橫軸的標記水平放置
# -A: 0, X軸標籤選擇0度
# -C: 自定義顏色,注意引號的使用,最外層引號與內層引號不一樣,引號之間無交叉
# -T: 指定給定的顏色的類型;若是給的是vector (以下面的例子), 則-T須要指定爲vector; 不然結果會很怪異,只有倆顏色。
# -t: 指定圖形的題目,注意引號的使用;參數中包含空格或特殊字符等都要用引號引發來做爲一個總體。
$ sp_pheatmap.sh -f heatmap_data.xls -d row -P heatmap_row_anno.xls -Q heatmap_col_anno.xls -u 8 -v 12 -A 0 -C 'c("white", "blue")' -T vector -t "Heatmap of gene expression profile"
相關文章
相關標籤/搜索