专栏名称: 生信菜鸟团
生信菜鸟团荣誉归来,让所有想分析生物信息学数据的小伙伴找到归属,你值得拥有!
目录
相关文章推荐
生物学霸  ·  83 岁院士自曝每天熬夜到 2 ... ·  昨天  
BioArt  ·  Nat Cell Biol | ... ·  昨天  
生物制品圈  ·  直播推荐 | ... ·  3 天前  
BioArt  ·  ​Nat Metab | ... ·  4 天前  
生物探索  ·  Nature | ... ·  4 天前  
51好读  ›  专栏  ›  生信菜鸟团

R tips:ggplot2进行多维原位图绘制

生信菜鸟团  · 公众号  · 生物  · 2025-01-04 21:00

主要观点总结

本文介绍了如何使用ggplot2的geom_tile图层在R中绘制热图,并且展示了如何在一个热图格子中展示多维信息,如多个基因表达量、多个组别数据等。文章提供了详细的R代码示例,包括模拟数据、合并热图、绘制多维信息热图等。

关键观点总结

关键观点1: 使用R中的ggplot2包绘制热图。

介绍了使用geom_tile图层绘制热图的基本方法。

关键观点2: 模拟热图数据。

通过R代码模拟两组热图数据dat_1和dat_2。

关键观点3: 合并多个热图数据。

将两个热图数据合并到同一个热图中,通过调整热图格子的高度和位置来实现。

关键观点4: 使用position_nudge绘制多维信息的热图。

通过将数据上移或下移,实现热图格子里展示多维信息,如多个基因表达量、多个组别数据等。

关键观点5: 优化热图展示。

通过数据标准化、添加热图格子边框等方式优化热图的展示效果。


正文

R中可以使用ggplot2的geom_tile图层绘制热图,可是有的时候我们想要每一个热图格子里面可以展示多维的信息:多个基因表达量、多个组别数据等等,而不是一个热图仅展示了一个表达量信息。本文可以解决这个需求。

先模拟两组热图数据,dat_1与dat_2:

  1. library(tidyverse)

  2. len_row 20

  3. len_col 5

  4. set.seed(1234)

  5. dat_1 matrix(

  6. rnorm(len_row * len_col, 0, 1),

  7. nrow = len_row,

  8. ncol = len_col

  9. )

  10. dat_2 matrix(

  11. rnorm(len_row * len_col, 0, 10),

  12. nrow = len_row,

  13. ncol = len_col

  14. )

  15. rownames(dat_1) paste0('row', seq.int(len_row))

  16. colnames(dat_1) paste0('col', seq.int(len_col))

  17. rownames(dat_2) paste0('row', seq.int(len_row))

  18. colnames(dat_2) paste0('col', seq.int(len_col))

  19. # plot dat_1, dat_2

  20. cowplot::plot_grid(

  21. pheatmap::pheatmap(dat_1, main = "dat_1", silent = T)$gtable,

  22. pheatmap::pheatmap(dat_2, main = "dat_2", silent = T)$gtable

  23. )

模拟数据展示

模拟数据如下图所示,而我们想要的效果是合并这两个热图,绘制到同一个热图中。

ggplot绘制热图

ggplot可以使用geom_tile绘制热图,比如dat1的热图可以绘制如下:

  1. dat_1_tidy

  2. dat_1 %>%

  3. as.data.frame() %>%

  4. rownames_to_column("row") %>%

  5. pivot_longer(-row, names_to = 'col', values_to = "val")

  6. dat_2_tidy

  7. dat_2 %>%

  8. as.data.frame() %>%

  9. rownames_to_column("row") %>%

  10. pivot_longer(-row, names_to = 'col', values_to = "val")

  11. # plot

  12. p_heat_1

  13. ggplot() +

  14. geom_tile(

  15. data = dat_1_tidy,

  16. aes(x = col, y = row, fill = val, height = 1, width = 1)

  17. ) +

  18. scale_fill_gradientn(colors = rev(RColorBrewer::brewer.pal(11, 'RdBu'))) +

  19. theme_minimal()

  20. p_heat_1

热图如下图:

使用position_nudge绘制多维信息的热图

如果需要将两个热图合并到一起,那么可以将热图的格子高度减为以前的一半,然后将其中一个数据上移,另一个数据下移,那么就可以将两组数据刚好在原来的位置堆叠摆放:

  1. p_heat_combined

  2. ggplot() +

  3. geom_tile(

  4. data = dat_1_tidy,

  5. aes(x = col, y = row, fill = val, height = 0.5, width = 1),

  6. position = position_nudge(y = 0.25)

  7. ) +

  8. scale_fill_gradientn(colors = RColorBrewer::brewer.pal(9, 'Blues')) +

  9. theme_minimal() +

  10. ggnewscale::new_scale_fill() +

  11. geom_tile(

  12. data = dat_2_tidy,

  13. aes(x = col, y = row, fill = val, height = 0.5, width = 1),

  14. position = position_nudge(y = -0.25)

  15. ) +

  16. scale_fill_gradientn(colors = RColorBrewer::brewer.pal(9, "Reds")) +

  17. labs(

  18. fill_ggnewscale_1 = "dat1",

  19. fill = "dat2"

  20. )

  21. p_heat_combined

如下图所示,两组数据以不同颜色方案(蓝色是dat1,红色是dat2)的方式组合到了一起,如果不需要分开两个颜色方案,可以关闭上述代码中的ggnewscale::newscalefill。

另可以将每个热图格子的边框加上:

  1. p_heat_combined2

  2. p_heat_combined +

  3. geom_tile(

  4. data = dat_1_tidy,

  5. aes(x = col, y = row), color = "gray50", fill = NA, linewidth = 0.6

  6. )

  7. p_heat_combined2

略做优化的一个多维热图

  1. # data做scale

  2. dat_1_tidy2

  3. dat_1_tidy %>%

  4. group_by(row) %>%

  5. mutate(val = as.numeric(scale(val)))

  6. dat_2_tidy2

  7. dat_2_tidy %>%

  8. group_by(row) %>%

  9. mutate(val = as.numeric(scale(val)))

  10. # 绘图

  11. p_heat_combined3

  12. ggplot() +

  13. geom_tile(

  14. data = dat_1_tidy2,

  15. aes(x = col, y = row, fill = val, height = 0.3, width = 0.9),

  16. position = position_nudge(y = 0.15)

  17. ) +

  18. scale_fill_gradientn(colors = RColorBrewer::brewer.pal(9, 'Blues')) +

  19. theme_minimal() +

  20. theme(panel.grid = element_blank()) +

  21. geom_tile(

  22. data = dat_2_tidy2,

  23. aes(x = col, y = row, fill = val, height = 0.3, width = 0.9),

  24. position = position_nudge(y = -0.15)

  25. ) +

  26. scale_fill_gradientn(colors = rev(RColorBrewer::brewer.pal(11, "RdBu"))) +

  27. geom_tile(

  28. data = dat_1_tidy,

  29. aes(x = col, y = row), color = "gray80", fill = NA, linewidth = 0.6

  30. )

  31. p_heat_combined3

稍作优化,将数据做scale处理,每个热图格子里面绘制两组数据:上面的是dat1,下面的是dat2,热图格子加灰色边框,如下图所示:

这个思路是可以推广的,不限于只展示两组数据,而且也不限于是geom_tile图层,geom_point图层也是可以的。