生信绘图收入即学习生信分析过程中的一些小trick

热图:我要鲜明又直观的对比

2020-12-04  本文已影响0人  小洁忘了怎么分身

0.需求

如果直接拿基因的log表达量去画热图,画风是这样的:

(示例矩阵没有行名和列名,有行名列名的矩阵可用show_rownames = F,show_colnames = F参数隐藏行列名)

rm(list = ls())
library(pheatmap)
load("exp.Rdata")
exp[1:4,1:4]
##          [,1]     [,2]     [,3]     [,4]
## [1,]  4.54610  4.40210  4.49239 10.25060
## [2,] 11.25310 11.20760 11.17820  6.98791
## [3,]  5.81479  5.91209  6.11324 11.54910
## [4,] 11.64830 11.63730 11.59630  7.90508
pheatmap(exp)

可以看到,两组之间能看出差别,但是对比不鲜明。这个矩阵一行是一个基因在6个样本里的表达量,一列是一个样本里所有基因的表达量。我们如果可以强调列与列之间的差别,图就会更加直观了,实现这一目的的办法是将数据按行标准化,用到scale,它既是一个函数,又是pheatmap的一个参数。

1.强调列与列之间的差别

有两个方法:一个是内部标准化,画图时使用pheatmap自带的scale参数:

pheatmap(exp,scale = "row")

一个是外部标准化,先scale再画图。

n = t(scale(t(exp)))
pheatmap(n)

这个例子 样本数量较少,两张图一毛一样。我们来换个样本量多的数据。

2.换个样本多的数据来试试

这是tinyarray包里的内置数据,装了包就可以直接用哦

if(!require(tinyarray)) devtools::install_github("xjsun1221/tinyarray")
library(tinyarray)
exp2 = log2(exp_hub1+1)
pheatmap(exp2,show_colnames = F,scale = "row")
pheatmap(t(scale(t(exp2))),show_colnames = F)

这次,两张图看出区别了吧?

聚类情况是一致的,但是颜色分配不同哦,由于取了标准化以后还是有个别比较大/小的值,所以第一张图大片的颜色是比较淡的;第二张图大片的颜色是红色和黄色,边上挤着一点点蓝色。

配色不同,是因为breaks的计算模式不同,如果自己设置相同的breaks,两张图就一毛一样了哦

拼起来的图更直观~

自定义breaks设置了颜色分配范围,超出范围的格子将会以最大/小值颜色表示(我设置的是-3到3范围内从蓝到红的渐变,那么大于三的值会是最红的颜色,小于三的值则是最蓝的颜色)

当然 根据实际情况,你也可以设置-2到2的范围,-4到4的范围,可以调试,让他显示出鲜明的对比为止~

library(gridExtra)
p1 = pheatmap(exp2,show_colnames = F,scale = "row",breaks = seq(-3,3,length.out = 100),silent = T)
p2 = pheatmap(t(scale(t(exp2))),show_colnames = F,breaks = seq(-3,3,length.out = 100),silent = T)
grid.arrange(grobs=list(p1$gtable, p2$gtable))

从前遇到这种颜色,都是手动设置一下阈值,现在知道了breaks参数,就齐活啦,两个方法都可以完美的搞起了~

一个不重要的知识点

解释一下为什么上面的代码length.out是100。这是因为热图的默认配色是colorRampPalette(rev(brewer.pal(n = 7, name = "RdYlBu")))(100),这是100种颜色的渐变,所以breaks需要和这里的100呼应。

so,当你换颜色的时候,比如:

pheatmap(exp2,
         show_colnames = F,
         scale = "row",
         color = colorRampPalette(c("navy", "white", "firebrick3"))(50),
         breaks = seq(-3,3,length.out = 50))

前面是50,后面也要是50,对应起来~

上一篇 下一篇

猜你喜欢

热点阅读