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

作者: 小洁忘了怎么分身 | 来源:发表于2020-12-04 12:48 被阅读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,对应起来~

    相关文章

      网友评论

        本文标题:热图:我要鲜明又直观的对比

        本文链接:https://www.haomeiwen.com/subject/aeobwktx.html