在 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))
所以我使用 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))