在 geom_tile ggplot 中添加分隔和底部注释

Adding separations and bottom annotation in geom_tile ggplot

所以我使用 geom_tile() 创建了一个热图,如下所示:

df_temp <- df_master
df_temp$X <- c(1:length(df_master$CHR))
df_temp[ ,c('CHR')] <- list(NULL)
df_temp <- melt(df_temp, id.vars="X")

n1 <- length(unique(df_temp$variable))
n2 <- length(unique(df_temp$X))

ggplot(df_temp, aes(x = X, y = variable, fill = value)) +
  theme(axis.title.x = element_blank()) +
  theme(axis.ticks.x = element_blank(),
        axis.text.x = element_blank())  +
  geom_tile() + 
  scale_fill_gradientn(
            colors=c("grey","orange","dark red"), na.value="grey",
            values=rescale(c(0,5,40)),
            limits=c(0,40)) +
  geom_line(data = data.frame(x = c(0, n2) + 0.5, y = rep(2:n1, each = 2) - 0.5),
            aes(x = x, y = y, group = y), size=1, colour = 'white', inherit.aes = FALSE)

这产生了以下 heatmap。

但是,x 轴有一个子类别,将每个观察值从 1-20 分组并适当排序。我希望这能以某种方式反映在 ggplot 中,带有底部注释,并且可能在热图中有一些分隔?请原谅我的鼠标绘画技巧,但像这样:

所以底部注释应该像一个单行颜色图,指示上述观察结果属于哪个组。黑线表示这些组分开的确切位置。

这可能吗?我试过上网,但还没有找到明确的答案。谢谢!

编辑: 忘记添加 df_temp 的样子!

> df_temp
      X                variable      value    CHR
1     1                       A  0.3432559 M.m.01
2     2                       A  0.3675018 M.m.02
3     3                       A  0.8010609 M.m.06
4     4                       A  1.3608854 M.m.10
5     5                       A  0.3369016 M.m.13
6     6                       B  1.3765413 M.m.02
7     7                       B  1.5141245 M.m.03
8     8                       B  0.8467624 M.m.05
9     9                       B  0.7612501 M.m.07
10   10                       B  0.8377142 M.m.10
11   11                       B  0.4613787 M.m.13
12   12                       B  1.4047240 M.m.16
13   13                       B  0.9338802 M.m.19
14   14                       B  1.1825244 M.m.20
15   15                       C  0.3156074 M.m.01
16   16                       C  2.3541151 M.m.02
17   17                       C  2.3725061 M.m.05
18   18                       C  1.5970541 M.m.10
19   19                       D  0.3901532 M.m.01
20   20                       D  0.3156074 M.m.02
21   21                       D  2.9405363 M.m.03
22   22                       E  1.5055971 M.m.07
23   23                       E  1.8618063 M.m.08
24   24                       F  0.7314612 M.m.02
25   25                       F  0.7705067 M.m.03

其中 CHR 的范围从 M.m.01 到 M.m.20,变量范围来自 6 个不同的类别。这是melt()后的结果。

这可以通过使用 ggh4x 包的主题方面来完成。

所提供的示例数据并没有真正重现您的情节,因此我创建了具有相同结构的自己的情节以供说明之用。

library(ggh4x)

ggplot(df_temp, aes(x = X, y = variable, fill = value)) +
  geom_tile() +
  geom_hline(yintercept = 0:6 + 0.5, color = "white") +
  scale_x_continuous(expand = c(0.01, 0)) +
  scale_fill_gradientn(
            colors=c("grey","orange","dark red"), na.value="grey",
            values=scales::rescale(c(0,5,40)),
            limits=c(0,40)) +
  facet_grid2(.~CHR, scales = "free_x", space = "free_x", switch = "x",
              strip = strip_themed(
                background_x = elem_list_rect(
                  fill = rainbow(length(unique(df_temp$CHR)))))) +
  theme_bw(base_size = 16) +
  theme(axis.title.x     = element_blank(),
        axis.ticks.x     = element_blank(),
        axis.text.x      = element_blank(),
        panel.spacing.x  = unit(0, "mm"),
        panel.background = element_rect(fill = NA, color = "black", size = 1),
        panel.grid       = element_blank())


使用的数据

set.seed(1)

df_temp <- data.frame(X = rep(1:25, 6),
                      variable = rep(LETTERS[1:6], each = 25),
                      value = runif(25 * 6, 0, 2),
                      CHR = rep(paste("CHR", 
                                      rep(1:5, times = c(6, 4, 3, 7, 5))), 6))