R使用笔记: heatmap.2绘制热图

作者: GPZ_Lab | 来源:发表于2018-04-09 20:09 被阅读1150次

    笔记内容:

    • 热图的应用意义
    • 包的安装
    • scale的作用
    • 作图细节:系统发生树,label, color key的问题等
    • 补充:添加多行ColSideColors

    热图的应用意义

    在paper中常常能看到热图(heatmap):“形式为功能服务”。在我们常见的,使用矩阵作为Input的二维热图中,多为基因表达差异,16s分析中不同分组的物种丰度/相对丰度差异提供线索及可视化效果。

    使用热图可以直观通过颜色的深浅和差异判断样本/组别之间的差异。结合统计检验的显著性结果,可以评估出显著性的方向。热图可以通过算法生成系统树,表现各个subject及feature的聚类关系。

    在R中可以使用gplots包中的heatmap.2轻松画出热图。但对于其scale, 系统树的建立,以及很细节的字体大小,图片大小,color key的数值范围设置,对应的颜色设置等,均需要通过参数的调整实现。虽然比起其他编程工具,R是个封装很严实的软件,这意味着许多参数不能很灵活的去修改。但这不妨碍我们充分使用它带来的便利。

    包的安装
    install.packages("gplots")
    install.packages("RColorBrewer")
    
    install.packages("devtools")
    library(devtools)
    install.github("stanstrup/massageR")
    

    安装massageR包是为了对热图的input矩阵做一些处理,这个包的安装有些曲折,在win10系统上按照以下两步先安装devtools再通过github装massageR没问题,但是在linux系统上不能在R sutdio里直接这么安装,详见 R使用笔记第11条
    在本笔记中不使用massageR包也可以,heatmap.2可以搞定。

    scale的作用
    plot_color = c('orange','green')[treatment]
    # treatment为meta data中提取出的分组信息,必须为一个factor
    # 如果在input data中把sampleID整理为分组的顺序,那么会在colsidecolors这里显示为整齐的分为两组。
    
    heatmap.2(x,               #Input必须是matrix
              trace="none",    # trace可以给每个色块中添加一条线,与行平行或者与列平行。其与色块中心的距离代表了这个值被显示的比例。
              scale="none",    # scale在这里
              ColSideColors = plot_color,   # 按照treatment组别给每个subject一个颜色
              dendrogram = "row",   # 生成row的系统发生树
              symbreaks = TRUE,
              col=rev(colorRampPalette(brewer.pal(10, "RdBu"))(20)),  # color key, 后面详叙
              breaks = seq(-0.5,0.5,0.05),   # 还是color key
              density.info=c("none"),  # 还是color key
              margins=c(8,16),  # 调整热图大小比例
              cexRow = 0.8, cexCol = 1.0,   # 行列名字体大小
              srtCol = 45, offsetCol = -0.5 # 调整列名的字体倾斜45度,距离热图的距离缩小。
    )
    

    会出现这样的图。很丑,看不出规律。这是因为我们input的矩阵还没有经过标准化(normalized/scaling)。许多值集中在一个很小的范围,突然出现几个很大的值,大得不成比例。导致这种情况:为了照顾那几个极端值,大部分值之间的差异被掩盖掉了,所以留下大片几乎一样的颜色。标准化即经过一定比例控制,将数据的规律保留,并将数值标化在一个相对稳定的范围内,更加便于作图。

    但是如果把scale的参数调整为scale="row"
    scale = "row" 即针对行进行标化,

    作图细节:系统发生树,label,color key的问题等
    heatmap.2(x,            
              trace="none",
              scale="none",    # scale在这里
              ColSideColors = plot_color,   # 按照treatment组别给每个subject一个颜色
    
              Rowv = TRUE,   # 决定是否要将row按照系统发生树cluster的结果重新排序,注意要和dendrogram一致。同理还有Colv =  
              dendrogram = "row",   # 生成row的系统发生树
              symbreaks = TRUE,
              col=rev(colorRampPalette(brewer.pal(10, "RdBu"))(20)),  
              # color key在左上角,本图中为row-scale过,所以为row Z-score
              # 设置color key的颜色,这里为20个色块构成,从蓝色到红色
    
              breaks = seq(-0.5,0.5,0.05),   
              # 设置color key的范围,这里必须和上面col = 的20个色块对应起来。
              # 从-0.5到0.5,以0.05为一个step,一共20个step, 对应20个色块。
              
              density.info=c("none"),  
              # 设置color key中是否需要显示各个范围的count数目及其比例。none就不设置。
              
              margins=c(8,16),  
              # 调整热图大小比例,在label的名字特别长的时候可以尝试调整,让Label显示完全
              cexRow = 0.8, cexCol = 0.8,   # 行/列名字体大小
              keysize = 0.8  # 可以配合margins = 调节图例的大小及整个图的比例
             
              colsep = c(15, 54) 
              #在热图中加入白色竖线,从而将其分成不同的部分。这个表示在第15个及第54个column的位置加上竖线。同理还有rowsep = 
    )
    

    如果想把生成系统发生树聚类后的数据拿出来(即获得聚类后重新排列后的数据):

    map <- heatmap.2(as.matrix(x), ...)
    x_reorder <- x[rev(map$rowInd), map$colInd]
    # x_reorder 为重新排序后的数据
    

    heatmap.2的文件非常详细,见这个链接

    添加多行ColSideColors

    需要用到heatmap.plus包,其各种参数和heatmap.2差不多,但是heatmap.2只能为ColSideColors设置与column长度相当的character, heatmap.plus可以设置为matrix: 其实只用把两个(或者多个)含有颜色分配信息的vectorcbind到一起就可以了。
    调整参数为ColSideColors = color # 注意使用heatmap.plus

    相关文章

      网友评论

        本文标题:R使用笔记: heatmap.2绘制热图

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