查看: 630|回复: 5

[R语言] 他好像在玩一种很新的热图图例……

[复制链接]

管理员

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

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

发表于 2022.11.28 10:47:01 | 显示全部楼层 |阅读模式
热图作为最常用的可视化图表之一,更加个性化、可定制的呈现是大家关注的重点。

一般热图图例是均匀的:

(左:取对数后图例;右:原始数据图例)

上图是同一个矩阵,根据数据分布定义了四种配色(白→蓝→黄→红)后对应渐变图例的效果。取对数后比较正常,但如果我们使用原始数据绘图,并定义非均匀的配色刻度时,可以看到蓝色部分对应的数据量由于太小(几百)从而无法在图例中展示。

遇到这些情况,我们就需要定制一种能显示不均匀刻度的图例了,如下图:

(调整后:不均匀刻度图例)

下面开始今天的学习,用到ComplexHeatmap包!

  1. #相关R包载入:
  2. library(circlize)
  3. library(ComplexHeatmap)
  4. #载入ComplexHeatmap包自带测试数据集:
  5. ##1930-2001美国各州的麻疹疫苗案例数;
  6. mat <- readRDS(system.file("extdata", "measles.rds", package = "ComplexHeatmap"))
  7. mat[1:6,1:6]
复制代码


  1. #矩阵取对数:
  2. dt <- log2(mat+1)
  3. dt[1:6,1:6]
复制代码


  1. #根据数据区间自定义颜色:
  2. range(dt)
复制代码


  1. col <- colorRamp2(c(0, 4, 8, 16), c("white", "#7a97ee", "yellow", "#fc3b01"))
  2. Heatmap(
  3. dt,
  4. col = col,
  5. rect_gp = gpar(col= "white"), #描边颜色
  6. cluster_columns = FALSE,#是否对列聚类
  7. show_column_names = FALSE, #是否显示列名
  8. cluster_rows = TRUE, #是否对行聚类
  9. show_row_dend = FALSE, #是都显示行聚类树
  10. row_names_side = "left",#行名显示方向
  11. row_names_gp = gpar(fontsize = 8), #行名字号
  12. name = "log2Cases", #图例名
  13. )
复制代码


取对数只能反应趋势,但假如我们的诉求是用热图展示真实的案例数,并根据所关注的数量级来自定义热图配色:

  1. #用热图展示原始数据:
  2. range(mat)
复制代码


  1. col <- colorRamp2(c(0, 600, 1000, 100000), c("white", "#0d4be5", "yellow", "#e90304"))
  2. Heatmap(
  3. mat,
  4. col = col,
  5. rect_gp = gpar(col= "white"),
  6. cluster_columns = FALSE,
  7. show_column_names = FALSE,
  8. cluster_rows = TRUE,
  9. show_row_dend = FALSE,
  10. row_names_side = "left",
  11. row_names_gp = gpar(fontsize = 8),
  12. name = "Cases",
  13. )
复制代码

此时图例仍然是均匀分布的,无法显示热图中蓝色部分对应的数据大小。


下面使用heatmap_legend_param这个参数来定制图例。

  1. #添加非均匀刻度图例:
  2. Heatmap(
  3. mat,
  4. col = col,
  5. rect_gp = gpar(col= "white"),
  6. cluster_columns = FALSE,
  7. show_column_names = FALSE,
  8. cluster_rows = TRUE,
  9. show_row_dend = FALSE,
  10. row_names_side = "left",
  11. row_names_gp = gpar(fontsize = 8),
  12. name = "Cases",
  13. heatmap_legend_param = list(
  14. at = c(0, 400, 800, 50000, 100000, 150000) #指定图例显示刻度
  15. )
  16. )
复制代码


此时还是看不到蓝色(对应600),0-800的部分由于数据差异过大都在底部被压缩。不过没关系,我们可以自定义刻度间的相对距离。

  1. #自定义图例标签+调整刻度间距离:
  2. Heatmap(
  3. mat,
  4. col = col,
  5. rect_gp = gpar(col= "white"),
  6. cluster_columns = FALSE,
  7. show_column_names = FALSE,
  8. cluster_rows = TRUE,
  9. show_row_dend = FALSE,
  10. row_names_side = "left",
  11. row_names_gp = gpar(fontsize = 8),
  12. name = "Cases",
  13. heatmap_legend_param = list(
  14. at = c(0, 400, 800, 50000, 100000, 150000),
  15. labels = c("0", "400", "800", "50k", "100k", "150k"), #指定刻度对应的显示标签
  16. break_dist = c(1.5, 1.5, 3, 3, 3) #显示刻度间的相对距离
  17. )
  18. )
复制代码


此时就能将图例和热图对应上啦!蓝色部分对应的Cases一目了然!

刻度连接线的存在为了让分布不均匀的标签之间不会重叠,如果大家不想展示,可以通过拉长图例来增加标签的空间。

  1. #图例高度调整:
  2. Heatmap(
  3. mat,
  4. col = col,
  5. rect_gp = gpar(col= "white"),
  6. cluster_columns = FALSE,
  7. show_column_names = FALSE,
  8. cluster_rows = TRUE,
  9. show_row_dend = FALSE,
  10. row_names_side = "left",
  11. row_names_gp = gpar(fontsize = 8),
  12. name = "Cases",
  13. heatmap_legend_param = list(
  14. at = c(0, 400, 800, 50000, 100000, 150000),
  15. labels = c("0", "400", "800", "50k", "100k", "150k"),
  16. break_dist = c(1.5, 1.5, 3, 3, 3),
  17. legend_height = unit(4.5, "cm") #图例的高度(纵向图例,调整高度;横向图例,调整宽度)
  18. )
  19. )
复制代码


  1. #还可以把图例打横放到热图底部:
  2. p <- Heatmap(
  3. mat,
  4. col = col,
  5. rect_gp = gpar(col= "white"),
  6. cluster_columns = FALSE,
  7. show_column_names = FALSE,
  8. cluster_rows = TRUE,
  9. show_row_dend = FALSE,
  10. row_names_side = "left",
  11. row_names_gp = gpar(fontsize = 8),
  12. name = "Cases",
  13. heatmap_legend_param = list(
  14. at = c(0, 400, 800, 50000, 100000, 150000),
  15. labels = c("0", "400", "800", "50k", "100k", "150k"),
  16. break_dist = c(1.5, 1.5, 3, 3, 3),
  17. legend_width = unit(8, "cm"), #横向图例记得调整的是宽度
  18. direction = "horizontal", #图例方向
  19. title_position = "lefttop" #图例标题位置
  20. )
  21. )
  22. draw(p, heatmap_legend_side = "bottom")
复制代码


  1. #更换一个配色:
  2. col2 <- colorRamp2(c(0, 600, 1000, 100000), c("white", "#66be63", "yellow", "#772584"))
  3. Heatmap(
  4. mat,
  5. col = col2,
  6. rect_gp = gpar(col= "white"),
  7. cluster_columns = FALSE,
  8. show_column_names = FALSE,
  9. cluster_rows = TRUE,
  10. show_row_dend = FALSE,
  11. row_names_side = "left",
  12. row_names_gp = gpar(fontsize = 8),
  13. name = "Cases",
  14. heatmap_legend_param = list(
  15. at = c(0, 400, 800, 50000, 100000, 150000),
  16. labels = c("0", "400", "800", "50k", "100k", "150k"),
  17. break_dist = c(1.5, 1.5, 3, 3, 3),
  18. legend_height = unit(4.5, "cm") #图例的高度
  19. )
  20. )
复制代码


好啦,今天的分享就到这里!更多个性化热图绘制可戳往期:

个性化热图绘制:
《分享几种热图的画法》
《环形热图的绘制方法》
《多维度数据展示!双边热图了解一下?》

指定热图分组和基因标记:
《个性化热图如此简单?加分组/指定基因标签简直小case!》
《如何为热图添加指定的基因标记?》
《如何提取热图聚类簇中的基因?》

组合型热图绘制:
《如何绘制漂亮的组合热图》
《彩!这般漂亮又个性的热图怎么画》
《如何绘制通路图与热图的组合图?》

参考资料

https://mp.weixin.qq.com/s/vbJYTu-__jHZqT__0-5pgA


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


本文作者:基迪奥-喵酱

本帖子中包含更多资源

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

x
新的一天加油!
回复

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

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

发表于 2022.11.28 11:47:31 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

中华鲟

Rank: 5Rank: 5

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

发表于 2022.11.29 09:39:09 | 显示全部楼层
11月第二十一天
新的一天加油!
回复 支持 反对

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

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

发表于 2022.11.29 11:12:25 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

中华鲟

Rank: 5Rank: 5

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

发表于 2022.11.30 09:47:16 | 显示全部楼层
11月最后一天
新的一天加油!
回复 支持 反对

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

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

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

使用道具 举报

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

本版积分规则

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