前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >R tips:ggplot2进行多维原位图绘制

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

作者头像
生信菜鸟团
发布2025-01-07 14:18:40
发布2025-01-07 14:18:40
6200
代码可运行
举报
文章被收录于专栏:生信菜鸟团生信菜鸟团
运行总次数:0
代码可运行

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

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

代码语言:javascript
代码运行次数:0
复制
library(tidyverse)
 

 
len_row <- 20
 
len_col <- 5
 

 
set.seed(1234)
 
dat_1 <- matrix(
 
  rnorm(len_row * len_col, 0, 1),
 
  nrow = len_row,
 
  ncol = len_col
 
)
 

 
dat_2 <- matrix(
 
  rnorm(len_row * len_col, 0, 10),
 
  nrow = len_row,
 
  ncol = len_col
 
)
 

 
rownames(dat_1) <- paste0('row', seq.int(len_row))
 
colnames(dat_1) <- paste0('col', seq.int(len_col))
 

 
rownames(dat_2) <- paste0('row', seq.int(len_row))
 
colnames(dat_2) <- paste0('col', seq.int(len_col))
 

 
# plot dat_1, dat_2
 
cowplot::plot_grid(
 
  pheatmap::pheatmap(dat_1, main = "dat_1", silent = T)$gtable,
 
  pheatmap::pheatmap(dat_2, main = "dat_2", silent = T)$gtable
 
)

模拟数据展示

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

ggplot绘制热图

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

代码语言:javascript
代码运行次数:0
复制
dat_1_tidy <-
 
  dat_1 %>%
 
 as.data.frame() %>%
 
  rownames_to_column("row") %>%
 
  pivot_longer(-row, names_to = 'col', values_to = "val")
 

 

 
dat_2_tidy <-
 
  dat_2 %>%
 
 as.data.frame() %>%
 
  rownames_to_column("row") %>%
 
  pivot_longer(-row, names_to = 'col', values_to = "val")
 

 
# plot
 
p_heat_1 <-
 
  ggplot() +
 
  geom_tile(
 
    data = dat_1_tidy,
 
    aes(x = col, y = row, fill = val, height = 1, width = 1)
 
 ) +
 
  scale_fill_gradientn(colors = rev(RColorBrewer::brewer.pal(11, 'RdBu'))) +
 
  theme_minimal()
 
p_heat_1

热图如下图:

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

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

代码语言:javascript
代码运行次数:0
复制
p_heat_combined <- 
 
  ggplot() +
 
  geom_tile(
 
    data = dat_1_tidy,
 
    aes(x = col, y = row, fill = val, height = 0.5, width = 1),
 
    position = position_nudge(y = 0.25)
 
 ) +
 
  scale_fill_gradientn(colors = RColorBrewer::brewer.pal(9, 'Blues')) +
 
  theme_minimal() +
 
  ggnewscale::new_scale_fill() +
 
  geom_tile(
 
    data = dat_2_tidy,
 
    aes(x = col, y = row, fill = val, height = 0.5, width = 1),
 
    position = position_nudge(y = -0.25)
 
 ) +
 
  scale_fill_gradientn(colors = RColorBrewer::brewer.pal(9, "Reds")) +
 
  labs(
 
    fill_ggnewscale_1 = "dat1",
 
    fill = "dat2"
 
 ) 
 
p_heat_combined

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

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

代码语言:javascript
代码运行次数:0
复制
p_heat_combined2 <-
 
  p_heat_combined + 
 
  geom_tile(
 
    data = dat_1_tidy,
 
    aes(x = col, y = row), color = "gray50", fill = NA, linewidth = 0.6
 
 )
 
p_heat_combined2

略做优化的一个多维热图

代码语言:javascript
代码运行次数:0
复制
# data做scale
 
dat_1_tidy2 <- 
 
  dat_1_tidy %>% 
 
  group_by(row) %>% 
 
  mutate(val = as.numeric(scale(val)))
 

 
dat_2_tidy2 <- 
 
  dat_2_tidy %>% 
 
  group_by(row) %>% 
 
  mutate(val = as.numeric(scale(val)))
 

 
# 绘图
 
p_heat_combined3 <-
 
  ggplot() +
 
  geom_tile(
 
    data = dat_1_tidy2,
 
    aes(x = col, y = row, fill = val, height = 0.3, width = 0.9),
 
    position = position_nudge(y = 0.15)
 
 ) +
 
  scale_fill_gradientn(colors = RColorBrewer::brewer.pal(9, 'Blues')) +
 
  theme_minimal() +
 
  theme(panel.grid = element_blank()) +
 
  geom_tile(
 
    data = dat_2_tidy2,
 
    aes(x = col, y = row, fill = val, height = 0.3, width = 0.9),
 
    position = position_nudge(y = -0.15)
 
 ) +
 
  scale_fill_gradientn(colors = rev(RColorBrewer::brewer.pal(11, "RdBu"))) +
 
  geom_tile(
 
    data = dat_1_tidy,
 
    aes(x = col, y = row), color = "gray80", fill = NA, linewidth = 0.6
 
 )
 
p_heat_combined3

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信菜鸟团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模拟数据展示
  • ggplot绘制热图
  • 使用position_nudge绘制多维信息的热图
  • 略做优化的一个多维热图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档