查看: 4375|回复: 19

[R语言] 热图也开始“内卷”——环形热图如何绘制?

  [复制链接]

管理员

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

主题
954
注册时间
2020.6.16
在线时间
501 小时

发表于 2021.12.14 10:26:42 | 显示全部楼层 |阅读模式
正常情况下,我们绘制的常规热图都是直直的,这样更便于我们进行数据的展示和阅读;

但上周收到小伙伴的问题:能不能把热图“卷”起来,绘制环状的热图?当然也是可以的,我们先看几个文献中的案例:

BMC Genomics,2018)

Microbial Biotechnology, 2017)

Cell,2021)

环状热图我们也经常会在论文中看到,用法和热图相同,但更适合于需要展示较多基因(数据)时来使用,这样我们团一团后可以既美观又省版面空间;不过一般情况还是建议使用常规热图哦。

今天就给有需要要小伙伴们分享一下R语言绘制环状热图的方法,主要用到的ComplexHeatmap包绘制热图和circlize包中的circos.heatmap()函数将热图从“直”拉“弯。”

[AppleScript] 纯文本查看 复制代码
#所需包的安装和载入:
install.packages("circlize")
install.packages("ComplexHeatmap")
library('ComplexHeatmap')
library('circlize')

#设置工作目录和载入本地数据:
setwd("C:/Users/Desktop/环形热图")
data<-read.csv("circle heatmap eg.csv",header=T,row.names=1)
head(data)
#转化为矩阵并对其进行归一化:
madt<-as.matrix(data)



[AppleScript] 纯文本查看 复制代码
madt2<-t(scale(t(madt)))



[AppleScript] 纯文本查看 复制代码
#默认参数绘制普通热图
Heatmap(madt2)



[AppleScript] 纯文本查看 复制代码
#计算数据大小范围
range(madt2)
#重新定义热图颜色梯度:
mycol=colorRamp2(c(-1.7, 0.3, 2.3),c("blue", "white", "red"))

#绘制基础环形热图:
circos.heatmap(madt2,col=mycol)
circos.clear()#绘制完成后需要使用此函数完全清除布局



[AppleScript] 纯文本查看 复制代码
#在circos.heatmap()中添加参数进行环形热图的调整和美化:
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)
circos.clear()
#circos.par()调整圆环首尾间的距离,数值越大,距离越宽
#dend.side:控制行聚类树的方向,inside为显示在圆环内圈,outside为显示在圆环外圈
#rownames.side:控制矩阵行名的方向,与dend.side相同;但注意二者不能在同一侧,必须一内一外
#cluster=TRUE为对行聚类,cluster=FALSE则不显示聚类



[AppleScript] 纯文本查看 复制代码
#聚类树的调整和美化(需要用到两个别的包):
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)
}
)
circos.clear()
#track.height:轨道的高度,数值越大圆环越粗
#dend.track.height:调整行聚类树的高度
#dend.callback:用于聚类树的回调,当需要对聚类树进行重新排序,或者添加颜色时使用
#包含的三个参数:dend:当前扇区的树状图;m:当前扇区对应的子矩阵;si:当前扇区的名称
#color_branches():修改聚类树颜色



[AppleScript] 纯文本查看 复制代码
#添加图例标签等
lg=Legend(title="Exp",col_fun=mycol,direction = c("vertical"))
grid.draw(lg)



[AppleScript] 纯文本查看 复制代码
#添加列名:
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.8,"mm"),#x坐标
7.8+(1:n)*1.1,#y坐标
cn,cex=0.8,adj=c(0,1),facing="inside")
}
},bg.border=NA)
circos.clear()



[AppleScript] 纯文本查看 复制代码
#更换热图配色,并重新绘图:
#这里代码和上文相同,仅改变了颜色和circos.par(圆环首位的距离)
mycol2=colorRamp2(c(-1.7, 0.3, 2.3),c("#57ab81", "white", "#ff9600"))
circos.par(gap.after=c(22))
circos.heatmap(madt2,col=mycol2,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)
}
)
lg=Legend(title="Exp",col_fun=mycol2,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.8,"mm"),#x坐标
7.8+(1:n)*1.1,#y坐标
cn,cex=0.8,adj=c(0,1),facing="inside")
}
},bg.border=NA)
circos.clear()



[AppleScript] 纯文本查看 复制代码
#分组热图绘制:
#circos.heatmap()内只能是一个矩阵,但如果矩阵数据存在分组,可以用split参数来指定分类变量
split = sample(letters[1:2], 40, replace = TRUE)
split = factor(split, levels = letters[1:2])
circos.par(gap.after=c(22))
circos.heatmap(madt2,col=mycol2,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)
}
)
lg=Legend(title="Exp",col_fun=mycol2,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==1){
cn=colnames(madt2)
n=length(cn)
circos.text(rep(CELL_META$cell.xlim[2],n)+convert_x(0.8,"mm"),
7.8+(1:n)*1.1,
cn,cex=0.8,adj=c(0,1),facing="inside")
}
},bg.border=NA)
circos.clear()



[AppleScript] 纯文本查看 复制代码
#多轨热图绘制:
#假设有两个热图的矩阵数据(这里仅为一组重复两次以作示范)
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.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)#加入第二个热图



[AppleScript] 纯文本查看 复制代码
#添加放置在左侧的图例:
install.packages("gridBase")
library(gridBase)
lg_Exp1=Legend(title="Exp1",col_fun=mycol2,direction = c("vertical"))
lg_Exp2=Legend(title="Exp2",col_fun=mycol,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()



好啦,今天的分享就到这里~

本文作者:基迪奥-喵酱

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
新的一天加油!
回复

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2019.3.26
在线时间
7 小时

发表于 2021.12.14 14:26:33 | 显示全部楼层
666666666666
新的一天加油!
回复 支持 反对

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
2
注册时间
2018.3.15
在线时间
27 小时

发表于 2021.12.14 15:31:35 | 显示全部楼层
这也太6了吧
新的一天加油!
回复 支持 反对

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

主题
0
注册时间
2020.11.21
在线时间
137 小时

发表于 2021.12.14 16:28:32 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
32
注册时间
2016.1.8
在线时间
655 小时

发表于 2021.12.14 16:51:33 | 显示全部楼层
很不错哦
新的一天加油!
回复

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

主题
3
注册时间
2017.9.8
在线时间
83 小时

发表于 2021.12.15 08:08:33 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
0
注册时间
2020.2.12
在线时间
133 小时

发表于 2021.12.15 08:42:37 | 显示全部楼层
666666666666666666
回复 支持 反对

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
13
注册时间
2019.6.21
在线时间
115 小时

发表于 2021.12.15 08:58:09 | 显示全部楼层
66666666666
新的一天加油!
回复 支持 反对

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
0
注册时间
2017.6.6
在线时间
183 小时

灌水之王


发表于 2021.12.15 08:58:41 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

主题
0
注册时间
2020.11.21
在线时间
137 小时

发表于 2021.12.15 22:53:13 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
1
注册时间
2016.8.25
在线时间
104 小时

发表于 2021.12.15 23:40:32 | 显示全部楼层
热图行业卷的挺厉害啊
今天也是元气满满的一天啊!
回复 支持 反对

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

主题
3
注册时间
2017.9.8
在线时间
83 小时

发表于 2021.12.16 08:03:31 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

主题
3
注册时间
2017.9.8
在线时间
83 小时

发表于 2021.12.17 08:14:44 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2020.11.9
在线时间
23 小时

发表于 2022.1.6 09:10:45 | 显示全部楼层
强,能够自由设计发挥的人太幸福了
回复 支持 反对

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
3
注册时间
2021.6.22
在线时间
64 小时

发表于 2022.1.7 10:42:20 | 显示全部楼层
学习
回复

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
0
注册时间
2017.11.3
在线时间
351 小时

发表于 2022.1.11 15:10:49 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

草履虫

Rank: 2

主题
0
注册时间
2017.4.5
在线时间
8 小时

发表于 2022.1.12 11:01:54

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2020.1.5
在线时间
52 小时

发表于 2022.1.12 15:54:29 | 显示全部楼层
66666666666
回复 支持 反对

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2017.5.11
在线时间
70 小时

发表于 2022.1.18 21:29:03 | 显示全部楼层
ヾ(≧▽≦*)o
回复 支持 反对

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2020.4.5
在线时间
2 小时

发表于 2022.2.11 16:20:34 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表