本文介绍了如何使用ggplot2的geom_tile图层在R中绘制热图,并且展示了如何在一个热图格子中展示多维信息,如多个基因表达量、多个组别数据等。文章提供了详细的R代码示例,包括模拟数据、合并热图、绘制多维信息热图等。
介绍了使用geom_tile图层绘制热图的基本方法。
通过R代码模拟两组热图数据dat_1和dat_2。
将两个热图数据合并到同一个热图中,通过调整热图格子的高度和位置来实现。
通过将数据上移或下移,实现热图格子里展示多维信息,如多个基因表达量、多个组别数据等。
通过数据标准化、添加热图格子边框等方式优化热图的展示效果。
R中可以使用ggplot2的geom_tile图层绘制热图,可是有的时候我们想要每一个热图格子里面可以展示多维的信息:多个基因表达量、多个组别数据等等,而不是一个热图仅展示了一个表达量信息。本文可以解决这个需求。
先模拟两组热图数据,dat_1与dat_2:
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的热图可以绘制如下:
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绘制多维信息的热图
如果需要将两个热图合并到一起,那么可以将热图的格子高度减为以前的一半,然后将其中一个数据上移,另一个数据下移,那么就可以将两组数据刚好在原来的位置堆叠摆放:
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。
另可以将每个热图格子的边框加上:
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
略做优化的一个多维热图
# 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图层也是可以的。