【R语言】——绘制环形热图 4(保姆级教程)

上一期“【R语言】——绘制按聚类结果分组的热图3”介绍了R语言pheatmap包绘制按聚类结果分组的热图,本期主要介绍使用ComplexHeatmap和circlize包绘制环形热图,环形热图可以将过长的热图变为环状,从而节省空间和使基因标签变得更为的清晰及美观。

1 数据准备

数据输入格式(csv格式):

 

2 R包加载及数据导入

#下载包#

install.packages("circlize")

BiocManager::install("ComplexHeatmap")

install.packages("RColorBrewer")

#加载包#

library('ComplexHeatmap')

library('circlize')

library("RColorBrewer")

#加载绘图数据#

#setwd("C:/Users/Desktop/环形热图")#设置工作路径

data<-read.table(file='C:/Rdata/jc/pheatmap.csv',header=TRUE,row.names= 1,sep=',')

#data=log2(data[,1:6]+1) #对基因表达量数据进行处理

head(data) #查看数据

#转化matrix格式矩阵及数据归一化

data <- as.matrix(data)

cir1<-t(scale(t(data)))

head(cir1) #查看数据#转化matrix格式矩阵及数据归一化

data <- as.matrix(data)

cir1<-t(scale(t(data)))

head(cir1) #查看数据

3 环状热图绘制

3.1 绘制普通热图

#定义热图颜色梯度:

mycol=colorRamp2(c(-2.5, 0.3, 3.1),c("blue","white","red"))#设置legend颜色,范围;可从https://www.58pic.com/peisebiao/网站进行配色

mycol1 = colorRamp2(c(-2, 0, 2), c("#003399", "white", "#cccc00"))

#mycol= colorRamp2(c(-1.45, 0, 2.27),c("#0273c2","white","#efc001"))

#mycol= colorRamp2(c(-1.45, 0, 2.27),c("#0da9ce","white","#e74a32"))

#默认参数绘制普通热图

Heatmap(cir1)

Heatmap(cir1,row_names_gp = gpar(fontsize = 6),

        column_names_gp= gpar(fontsize = 8),

        col= mycol,

        name="legend")

#计算数据大小范围

range(cir1)

图1 绘制的普通热图

3.2 基础环形热图绘制

#绘制基础环形热图:

circos.heatmap(cir1,col=mycol)

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

扫描二维码关注公众号,回复: 16735627 查看本文章

图2 基础环状热图

3.3 对环形热图进行调整与美化

3.3.1 对环形热图进行初步调整

#在circos.heatmap()中添加参数进行环形热图的调整和美化:

circos.par(gap.after=c(30)) #circos.par()调整圆环首尾间的距离,数值越大,距离越宽

circos.heatmap(cir1,col=mycol,

               dend.side="inside", #聚类放在环形内测,控制行聚类树的方向,inside为显示在圆环内圈,outside为显示在圆环外圈

               rownames.side="outside", #基因名放在环形外侧,控制矩阵行名的方向,与dend.side相同;但注意二者不能在同一侧,必须一内一外

               rownames.col="black",

               rownames.cex=0.5, #字体大小

               rownames.font=0.5, #字体粗细

               bg.border = "black",#背景边缘颜色

               #show.sector.labels = T,#显示分的区域的标签

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

circos.clear()#画完图结束。一定要运行这个,不然后续画图会叠加

图3 调整后的环形热图

 

3.3.2 对环形热图聚类树进行调整与美化

#聚类树的调整和美化:

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

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

library(dendextend)

library(dendsort)

circos.par(gap.after=c(30)) #circos.par()调整圆环首尾间的距离,数值越大,距离越宽

circos.heatmap(cir1,col=mycol,dend.side="inside",#dend.side:控制行聚类树的方向,inside为显示在圆环内圈,outside为显示在圆环外圈

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

               track.height = 0.28, #轨道的高度,数值越大圆环越粗

               rownames.col="black",

               rownames.cex=1, #字体大小

               rownames.font=1, #字体粗细

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

               dend.track.height=0.18, #调整行聚类树的高度

               dend.callback=function(dend,m,si) {#dend.callback:用于聚类树的回调,当需要对聚类树进行重新排序,或者添加颜色时使用包含的三个参数:dend:当前扇区的树状图;m:当前扇区对应的子矩阵;si:当前扇区的名称

                 color_branches(dend,k=15,col=1:15) #color_branches():修改聚类树颜色#聚类树颜色改为1,即单色/黑色

               }

)

图4 聚类树调整与美化后的热图

3.3.3 环形热图图例调整与列名添加

#添加图例标签等

#library(ComplexHeatmap)

#install.packages("gridBase")

library(gridBase)

lg=Legend(title="Exp",col_fun=mycol,

          direction = c("vertical"),

          #title_position= c('topcenter'),

)

grid.draw(lg)

#draw(lg, x = unit(0.9,"npc"), y = unit(0.5,"npc"), just = c("right","center"))#画在右边

#添加列名:

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

  if(CELL_META$sector.numeric.index==1){   #if(CELL_META$sector.numeric.index == 3) { # the last sector

    cn=colnames(cir1)

    n=length(cn)

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

                1:n+5,#调整y坐标

                cn,cex=0.6,adj=c(0,0.5),facing="inside")}

},bg.border=NA)

circos.clear()

图5 环形热图图例调整与列名添加后的热图

3.4 分组环形热图绘制

3.4.1 单轨分组

#分组热图绘制#

library(dendextend)

#但如果矩阵数据分组,可用split参数来指定分类变量

ann_row = data.frame(pathway=c(rep("pathway1",25),rep("pathway2",15),rep("pathway3",10)))#对行进行注释,用于后续的热图分裂

row.names(ann_row) = rownames(cir1)

ann_row <- as.matrix(ann_row)#在circlize函数中,需要为matrix

#分组绘图

circos.par(gap.after=c(2,2,30)) #circos.par()调整圆环首尾间的距离,数值越大,距离越宽#让分裂的一个口大一点,可以添加行信息

circos.heatmap(cir1,col=mycol,

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

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

               track.height = 0.28, #轨道的高度,数值越大圆环越粗

               rownames.col="black",

               bg.border="black", #背景边缘颜色

               split = ann_row,#用行注释分裂热图

               show.sector.labels = T,

               rownames.cex=0.9,#字体大小

               rownames.font=1,#字体粗细

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

               dend.track.height=0.18,#调整行聚类树的高度

               dend.callback=function(dend,m,si) {#dend.callback:用于聚类树的回调,当需要对聚类树进行重新排序,或者添加颜色时使用包含的三个参数:dend:当前扇区的树状图;m:当前扇区对应的子矩阵;si:当前扇区的名称

                 color_branches(dend,k=10,col=1:10)#color_branches():修改聚类树颜色#聚类树颜色改为1,即单色/黑色

               }

)
#图例与列名设置

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

grid.draw(lg)

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

  if(CELL_META$sector.numeric.index==3){# the last sector

    cn=colnames(cir1)

    n=length(cn)

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

                (1:n)*0.2-1.3,#调整y坐标,行距+距离中心距(1:n)*1.2+5,

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

  }

},bg.border=NA)

circos.clear()

图6 单轨处理的环形热图

3.4.2 多轨分组

#多轨热图绘制#

#假设有两个热图的矩阵数据(这里仅为一组重复两次以作示范)

cir1<-t(scale(t(data)))

cir2<-t(scale(t(data)))

#但如果矩阵数据分组,可用split参数来指定分类变量

ann_row = data.frame(pathway=c(rep("pathway1",25),rep("pathway2",15),rep("pathway3",10)))#对行进行注释,用于后续的热图分裂

ann_row2 = data.frame(pathway=c(rep("pathway1",25),rep("pathway2",15),rep("pathway3",10)))#对行进行注释,用于后续的热图分裂

row.names(ann_row) = rownames(cir1)

row.names(ann_row2) = rownames(cir2)

ann_row <- as.matrix(ann_row)#在circlize函数中,需要为matrix

ann_row2 <- as.matrix(ann_row2)

#绘图

circos.par(gap.after=c(2,2,30)) #circos.par()调整圆环首尾间的距离,数值越大,距离越宽#让分裂的一个口大一点,可以添加行信息

circos.heatmap(cir1,col=mycol,

               split=ann_row, #用行注释分裂热图

               rownames.col="black",

               show.sector.labels = T,

               #track.height = 0.28, #轨道的高度,数值越大圆环越粗

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

               rownames.cex=0.2,#字体大小

               rownames.font=1,#字体粗细

               bg.border="black", #背景边缘颜色

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

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

               dend.track.height=0.2,#调整行聚类树的高度

               dend.callback=function(dend,m,si) { #dend.callback:用于聚类树的回调,当需要对聚类树进行重新排序,或者添加颜色时使用包含的三个参数:dend:当前扇区的树状图;m:当前扇区对应的子矩阵;si:当前扇区的名称

                 color_branches(dend,k=10,col=1:10) #color_branches():修改聚类树颜色#聚类树颜色改为1,即单色/黑色

               }

)

circos.heatmap(cir2,

               col = mycol1,

               split=ann_row2,

               rownames.side="inside",

               bg.border="black", #背景边缘颜色

               rownames.cex=0.3)#加入第二个热图

#添加列名#

#第一个环形列名

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

  if(CELL_META$sector.numeric.index==3){# the last sector

    cn=colnames(cir1)

    n=length(cn)

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

                (1:n)*0.4+3.6,#调整y坐标,行距+距离中心距(1:n)*1.2+5,

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

  }

},bg.border=NA)

#第二个环形列名

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

  if(CELL_META$sector.numeric.index==3){# the last sector

    cn=colnames(cir2)

    n=length(cn)

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

                (1:n)*0.4+1,#调整y坐标,行距+距离中心距(1:n)*1.2+5,

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

  }

},bg.border=NA)

#添加放置在左侧的图例#

install.packages("gridBase")

library(gridBase)

lg_Exp1=Legend(title="Exp1",col_fun=mycol,direction = c("vertical"))

lg_Exp2=Legend(title="Exp2",col_fun=mycol1,direction = c("vertical"))

circle_size= unit(0.07,"snpc")

h= dev.size()

lgd_list= packLegend(lg_Exp1,lg_Exp2, max_height = unit(2*h,"inch"))

draw(lgd_list, x = circle_size, just ="left")

circos.clear()

图7 多轨热图

好了本次分享就到这里,下一期将分享相关性热图绘制。

扫码关注公众号,发送“环状热图4”获得完整代码以及演示数据包

猜你喜欢

转载自blog.csdn.net/weixin_54004950/article/details/128225038
今日推荐