查看: 417|回复: 12

[R语言] 继续卷!给你的环形热图指定基因标签!

[复制链接]

管理员

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

主题
907
注册时间
2020.6.16
在线时间
485 小时

发表于 2022.11.21 09:35:47 | 显示全部楼层 |阅读模式
如何把你的热图“卷”起来?感兴趣的可以戳往期:《热图也开始“内卷”——环形热图如何绘制?》

那如何在环形热图中自定义基因id标签?今天就来浅学习一波。

  1. #所需包的安装和载入:
  2. devtools::install_github("jokergoo/circlize") #必须装开发版
  3. install.packages("dendextend")
  4. install.packages("dendsort")

  5. library(ComplexHeatmap)
  6. library(circlize)
  7. library(dendextend)
  8. library(dendsort)
复制代码

circlize包大家记得要安装开发版哦,我们自定义标签使用到的新函数目前在稳定版中还没有更新。

  1. #本地表达矩阵读取
  2. dt <- read.csv('testdt.csv',header = T,row.names = 1)
  3. dt <- as.matrix(dt)
  4. dt[1:6,1:6]
复制代码


  1. #归一化:
  2. dt <- t(scale(t(dt)))
  3. dt[1:6,1:6]
复制代码


下面我们开始逐步绘制拆解绘制环形热图,帮助大家理解。

1. 绘制一个简单的环形热图

  1. #根据数据范围定义热图的颜色梯度:
  2. range(dt)
  3. mycol <- colorRamp2(c(-1.45, 0, 2.27),c("#0da9ce", "white", "#e74a32"))

  4. #环形热图绘制:
  5. circos.heatmap(dt,
  6. col = mycol)
  7. circos.clear()#绘制完成后,需要重置循环布局再开启下一次绘图,不然会遇到报错或轨道继续在同一图中叠加;
复制代码



2. 环形热图细节调整与美化

  1. #热图美化:
  2. circos.par(gap.after = c(50)) #调整圆环首位间距;
  3. circos.heatmap(dt,
  4. col = mycol,
  5. cluster = TRUE, #是否对行聚类
  6. dend.side = "inside", #聚类树方向:inside显示在圆环内圈,inside为圆环外圈;
  7. rownames.side ="outside", #行名方向;
  8. rownames.col = "black",
  9. rownames.cex = 0.6)
  10. circos.clear()
复制代码


  1. #聚类树美化:
  2. circos.par(gap.after=c(50))
  3. circos.heatmap(dt,
  4. col = mycol,
  5. cluster = TRUE,
  6. dend.side = "inside",
  7. rownames.side = "outside",
  8. rownames.col = "black",
  9. rownames.cex = 0.6,
  10. track.height = 0.2, #轨道高度,即圆环/格子的粗细
  11. dend.track.height = 0.08, #聚类树高度调整
  12. dend.callback = function(dend, m, si) { #聚类树的回调
  13. color_branches(dend,k = 10,col = 1:10) #修改聚类树颜色
  14. })
复制代码


  1. #添加图例:
  2. lg <- Legend(title = "Express",
  3. col_fun = mycol,
  4. direction = c("vertical"),
  5. title_position = c('topcenter'))
  6. draw(lg, x = unit(0.9, "npc"), y = unit(0.5, "npc"), just = c("right", "center"))
  7. circos.clear()
复制代码


3. 自定义显示标签

  1. #先重复上述代码,绘制环形热图(去掉行名):
  2. mycol2 <- colorRamp2(c(-1.45, 0, 2.27),c("#0273c2", "white", "#efc001"))
  3. circos.par(gap.after=c(50))
  4. circos.heatmap(dt,
  5. col = mycol2,
  6. cluster = TRUE,
  7. dend.side = "outside", #将聚类树放在圆环外侧
  8. #rownames.side = "inside",
  9. #rownames.col = "black",
  10. #rownames.cex = 0.6,
  11. track.height = 0.3,
  12. dend.track.height = 0.15,
  13. dend.callback = function(dend, m, si) {
  14. color_branches(dend,k = 10,col = 1) #聚类树颜色改为1,即单色/黑色
  15. })
  16. lg <- Legend(title = "Express",
  17. col_fun = mycol2,
  18. direction = c("vertical"),
  19. title_position = c('topcenter'))
  20. draw(lg, x = unit(0.95, "npc"), y = unit(0.5, "npc"), just = c("right", "center"))
复制代码


  1. #指定标签基因id:
  2. markid <- c('ZPR1','SNX6','PCF11','GNAO1','ACSS3',
  3. 'AUH','LOC101795171','HECTD1','GPX7','FDXR',
  4. 'LOC101790011','ADAP2','DHX8','TSNARE1','CORO2B')
  5. #索引在表达矩阵行名中的对应位置:
  6. row_ind <- match(markid, rownames(dt))
  7. row_ind
复制代码


  1. #根据索引计算标签在环形热图中的位置[该函数目前仅在开发版]:
  2. pos <- circos.heatmap.get.x(row_ind)
  3. head(pos)
  4. #x:在环形热图/即X轴上的位置;
  5. #row_ind:在原始矩阵中行的位置;
复制代码


  1. #为标签创建索指示点:
  2. anno <- rep("no", 50)
  3. anno[row_ind] <- "yes"
  4. circos.heatmap(anno,
  5. col = c("no" = "white", "yes" = "grey"),
  6. track.height = 0.01)
复制代码


  1. #添加标签:
  2. circos.labels(pos$sector, pos$x,
  3. cex = 0.8, #标签字体大小
  4. connection_height = mm_h(1), #索引连接线长度
  5. labels = markid)
  6. circos.clear()
复制代码


PS
测试时遇到一个小hug,使用circos.heatmap.get.x函数可以将我们的目标基因准确定位到环形热图中正确位置,这个OK;

但添加标签时目前仅支持按标签向量集中的顺序在图中顺时针依次添加,而热图经过了聚类,和原始矩阵行名的顺序也并不对应,所以我们需要先调整好向量集中的标签顺序(可以按聚类后热图中的行名顺序来调整)。

本次测试数据可通过链接获取。好啦,今天的分享就到这里!

参考资料
https://jokergoo.github.io/circlize_book/book/circos-heatmap.html


*未经许可,不得以任何方式复制或抄袭本篇文章之部分或全部内容。版权所有,侵权必究。


本文作者:基迪奥-喵酱

本帖子中包含更多资源

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

x
新的一天加油!
回复

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
0
注册时间
2016.5.10
在线时间
34 小时

发表于 2022.11.21 10:30:19 | 显示全部楼层
11月的第十四天
新的一天加油!
回复 支持 反对

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

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

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

使用道具 举报

迅猛龙

Rank: 8Rank: 8

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

发表于 2022.11.21 14:25:00 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2021.3.26
在线时间
24 小时

发表于 2022.11.21 20:35:55 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

迅猛龙

Rank: 8Rank: 8

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

发表于 2022.11.22 12:09:14 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
0
注册时间
2016.5.10
在线时间
34 小时

发表于 2022.11.22 12:13:10 | 显示全部楼层
11月第十四天
新的一天加油!
回复 支持 反对

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

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

发表于 2022.11.22 12:29:44 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

迅猛龙

Rank: 8Rank: 8

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

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

使用道具 举报

迅猛龙

Rank: 8Rank: 8

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

发表于 2022.11.23 11:42:30 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

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

发表于 2022.11.23 12:15:48 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
0
注册时间
2016.5.10
在线时间
34 小时

发表于 2022.11.23 20:48:38 | 显示全部楼层
11月的第十五天
新的一天加油!
回复 支持 反对

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

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

发表于 2022.11.24 10:56:42 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

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

本版积分规则

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