【R画图】环形热图

作者: jjjscuedu | 来源:发表于2021-12-21 17:28 被阅读0次

    热图(heatmap)在生信领域基本就是常规操作,基本技能,入门操作。能画热图的工具也有很多,我自己常用的R包是pheatmap。

    最近经常看见环状的热图,所以就搜了一下资料学习一下,测试一下。

    环状热图我也经常会在论文中看到,用法和热图相同,但更适合于需要展示较多基因(数据)时来使用。

    ===安装=====

    install.packages("circlize")

    install.packages("ComplexHeatmap")

    library('ComplexHeatmap')

    library('circlize')

    ===测试===

    data<-read.table("expression.txt",header=T,row.names=1)

    head(data)

    //转化为矩阵并对其进行归一化

    madt<-as.matrix(data)

    madt2<-t(scale(t(madt)))

    Heatmap(madt2)     //这就是默认参数,普通的热图

    range(madt2)   //查看值的分布

    mycol=colorRamp2(c(-1.7, 0.3, 2.3),c("blue", "white", "red")) //定义颜色范围

    circos.heatmap(madt2,col=mycol)  //默认参数

    注:

    circos.clear()  //绘制完成后需要使用此函数完全清除布局

    circos.par(gap.after=c(50))    //

    调整圆环首尾间的距离,数值越大,距离越宽

    circos.heatmap(madt2,col=mycol, dend.side="inside",rownames.side="outside",rownames.col="black",rownames.cex=0.9,rownames.font=1,cluster=TRUE)

    注:dend.side:控制行聚类树的方向,inside为显示在圆环内圈,outside为显示在圆环外圈

    #rownames.side:控制矩阵行名的方向,与dend.side相同;但注意二者不能在同一侧,必须一内一外

    #cluster=TRUE为对行聚类,cluster=FALSE则不显示聚类

    下面是换了inside和outside的结果:

    ===聚类树的调整和美化(需要用到两个别的包)===

    install.packages("dendextend")     //改颜色

    install.packages("dendsort")          //聚类树回调

    library(dendextend)

    library(dendsort)

    circos.par(gap.after=c(50))

    circos.heatmap(madt2,col=mycol,dend.side="inside",rownames.side="outside",track.height=0.38,rownames.col="black",rownames.cex=0.9,rownames.font=1,cluster=TRUE,dend.track.height=0.18,dend.callback=function(dend,m,si){color_branches(dend,k=15,col=1:15)})

    注:track.height:轨道的高度,数值越大圆环越粗  dend.track.height:调整行聚类树的高度  dend.callback:用于聚类树的回调,当需要对聚类树进行重新排序,或者添加颜色时使用

    包含的三个参数:dend:当前扇区的树状图;m:当前扇区对应的子矩阵;si:当前扇区的名称   color_branches():修改聚类树颜色

    circos.clear()

    //添加图例标签等

    lg=Legend(title="Exp",col_fun=mycol,direction= c("vertical"))

    grid.draw(lg)

    //添加列名

    circos.track(track.index=get.current.track.index(),panel.fun=function(x,y)

    {

    if(CELL_META$sector.numeric.index==1)

    {

    cn=colnames(madt2)

    n=length(cn)

    circos.text(rep(CELL_META$cell.xlim[2],n)+convert_x(0.3,"mm"), //x坐标

    4.1+(1:n)*0.7, //y坐标和间距

    cn,cex=0.8,adj=c(0,1),facing="inside")

    }

    },bg.border=NA)

    mycol2=colorRamp2(c(-1.7, 0.5, 2.3),c("#57ab81", "white", "#ff9600"))

    也可以更改上面的颜色,从而改变热图的配色:

    ===分组热图绘制========

    #circos.heatmap()内只能是一个矩阵,但如果矩阵数据存在分组,可以用split参数来指定分类变量

    split = sample(letters[1:2], 40, replace = TRUE)

    split = factor(split, levels = letters[1:2])

    circos.clear()

    circos.par(gap.after=c(22))

    circos.heatmap(madt2,col=mycol,split=split,dend.side="inside",rownames.side="outside",track.height = 0.38,

    rownames.col="black",rownames.cex=0.9,

    rownames.font=1,

    cluster=TRUE,

    dend.track.height=0.18,

    dend.callback=function(dend,m,si) 

    {

    color_branches(dend,k=15,col=1:15)

    }

    )

    //假设有两个热图的矩阵数据

    madt2<-t(scale(t(madt)))

    madt3<-t(scale(t(madt)))

    split2 = sample(letters[1:2], 40, replace = TRUE)

    split2 = factor(split2, levels = letters[1:2])

    circos.clear()

    circos.par(gap.after=c(8))

    circos.heatmap(madt2,col=mycol2,split=split2,dend.side="outside",

    cluster=TRUE,

    dend.track.height=0.2,

    dend.callback=function(dend,m,si) {

    color_branches(dend,k=15,col=1:15)

    }

    )

    circos.heatmap(madt3, col = mycol,rownames.side="inside",rownames.cex=0.8)

    本文使用 文章同步助手 同步

    相关文章

      网友评论

        本文标题:【R画图】环形热图

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