繪制熱圖除了使用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")
不改腳本的熱圖繪制
繪圖時通常會碰到兩個頭疼的問題:
- 需要畫很多的圖,唯一的不同就是輸出文件,其它都不需要修改。如果用R腳本,需要反復替換文件名,繁瑣又容易出錯。
- 每次繪圖都需要不斷的調整參數,時間久了不用,就忘記參數放哪了;或者調整次數過多,有了很多版本,最后不知道用哪個了。
為了簡化繪圖、維持腳本的一致,我用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"
