在具有多个方面变量的图中,ggplot2 重复“外部”变量的方面标签,而不是在“内部”变量的所有级别上使用单个跨越方面带。我有一些代码,我一直在使用这些代码来使用单个跨越小平面条来覆盖重复的外小平面标签gtable_add_grob
来自gtable
包裹。
不幸的是,由于构面条的 grob 结构发生了变化,此代码不再适用于 ggplot2 2.2.0。具体来说,在 ggplot2 的早期版本中,每行分面标签都有自己的一组 grobs。然而,在版本 2.2.0 中,每个垂直的构面标签堆栈看起来都是一个单独的 grob。这破坏了我的代码,我不知道如何修复它。
这是一个具体的例子,取自我几个月前回答过的一个问题 https://stackoverflow.com/questions/36968581/ggplot2-boxplot-with-colors-and-text-labels-mapped-to-combination-of-two-catego/36971938#36971938:
# Data
df = structure(list(location = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L), .Label = c("SF", "SS"), class = "factor"), species = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("AGR", "LKA"), class = "factor"),
position = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,
2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,
2L), .Label = c("top", "bottom"), class = "factor"), density = c(0.41,
0.41, 0.43, 0.33, 0.35, 0.43, 0.34, 0.46, 0.32, 0.32, 0.4,
0.4, 0.45, 0.34, 0.39, 0.39, 0.31, 0.38, 0.48, 0.3, 0.42,
0.34, 0.35, 0.4, 0.38, 0.42, 0.36, 0.34, 0.46, 0.38, 0.36,
0.39, 0.38, 0.39, 0.39, 0.39, 0.36, 0.39, 0.51, 0.38)), .Names = c("location",
"species", "position", "density"), row.names = c(NA, -40L), class = "data.frame")
# Begin with a regular ggplot with three facet levels
p=ggplot(df, aes("", density)) +
geom_boxplot(width=0.7, position=position_dodge(0.7)) +
theme_bw() +
facet_grid(. ~ species + location + position) +
theme(panel.margin=unit(0,"lines"),
strip.background=element_rect(color="grey30", fill="grey90"),
panel.border=element_rect(color="grey90"),
axis.ticks.x=element_blank()) +
labs(x="")
我们从一个具有三个层面的情节开始。
现在我们将用跨越条覆盖顶部的两个小面条,这样我们就不会出现重复的条标签:
pg = ggplotGrob(p)
# Add spanning strip labels for species
pos = c(4,11)
for (i in 1:2) {
pg <- gtable_add_grob(pg,
list(rectGrob(gp=gpar(col="grey50", fill="grey90")),
textGrob(unique(densityAGRLKA$species)[i],
gp=gpar(cex=0.8))), t=3,l=pos[i],b=3,r=pos[i]+7,
name=c("a","b"))
}
# Add spanning strip labels for location
pos=c(4,7,11,15)
for (i in 1:4) {
pg = gtable_add_grob(pg,
list(rectGrob(gp = gpar(col="grey50", fill="grey90")),
textGrob(rep(unique(densityAGRLKA$location),2)[i],
gp=gpar(cex=0.8))), t=4,l=pos[i],b=4,r=pos[i]+3,
name = c("c","d"))
}
grid.draw(pg)
这是 ggplot2 2.1.0 中该图的样子:
但是,如果我在 ggplot2 2.2.0 上尝试相同的代码,我会得到原始图,条带标签没有任何变化。看看原图的grob结构p
表明为什么会发生这种情况。我已将 grob 表粘贴到这个问题的底部。为了节省空间,我仅包含与面条相关的行。
看着cells
请注意,在 2.1.0 版本的绘图中,每行中的前两个数字是 3、4 或 5,表示该对象相对于绘图中其他对象的垂直位置。在上面的代码中,t
and l
论点gtable_add_grob
设置为值 3 或 4,因为这些是我想用跨越条覆盖的面条行。
现在看看cells
2.2.0 版本图中的列:请注意,前两个数字始终为 6。另请注意,小面条仅由 8 个小块组成,而不是 2.1.0 版本中的 24 个小块。在版本 2.2.0 中,似乎每堆三个方面标签现在都是一个单独的 grob,而不是三个单独的 grob。所以即使我改变t
and b
中的论点gtable_add_grob
到6,所有三个小面条都被覆盖。这是一个例子:
pg = ggplotGrob(p)
# Add spanning strip labels for species
pos = c(4,11)
for (i in 1:2) {
pg <- gtable_add_grob(pg,
list(rectGrob(gp=gpar(col="grey50", fill="grey90")),
textGrob(unique(densityAGRLKA$species)[i],
gp=gpar(cex=0.8))), t=6,l=pos[i],b=6,r=pos[i]+7,
name=c("a","b"))
}
因此,在冗长的介绍之后,这是我的问题:如何使用 ggplot2 版本 2.2.0 创建跨越面条,它看起来像我使用创建的那样gtable_add_grob
ggplot2 版本 2.1.0?我希望有一个简单的调整,但如果需要大手术,那也没关系。
ggplot2.1.0
pg
TableGrob (9 x 19) "layout": 45 grobs
z cells name grob
2 1 ( 3- 3, 4- 4) strip-top absoluteGrob[strip.absoluteGrob.147]
3 2 ( 4- 4, 4- 4) strip-top absoluteGrob[strip.absoluteGrob.195]
4 3 ( 5- 5, 4- 4) strip-top absoluteGrob[strip.absoluteGrob.243]
5 4 ( 3- 3, 6- 6) strip-top absoluteGrob[strip.absoluteGrob.153]
6 5 ( 4- 4, 6- 6) strip-top absoluteGrob[strip.absoluteGrob.201]
7 6 ( 5- 5, 6- 6) strip-top absoluteGrob[strip.absoluteGrob.249]
8 7 ( 3- 3, 8- 8) strip-top absoluteGrob[strip.absoluteGrob.159]
9 8 ( 4- 4, 8- 8) strip-top absoluteGrob[strip.absoluteGrob.207]
10 9 ( 5- 5, 8- 8) strip-top absoluteGrob[strip.absoluteGrob.255]
11 10 ( 3- 3,10-10) strip-top absoluteGrob[strip.absoluteGrob.165]
12 11 ( 4- 4,10-10) strip-top absoluteGrob[strip.absoluteGrob.213]
13 12 ( 5- 5,10-10) strip-top absoluteGrob[strip.absoluteGrob.261]
14 13 ( 3- 3,12-12) strip-top absoluteGrob[strip.absoluteGrob.171]
15 14 ( 4- 4,12-12) strip-top absoluteGrob[strip.absoluteGrob.219]
16 15 ( 5- 5,12-12) strip-top absoluteGrob[strip.absoluteGrob.267]
17 16 ( 3- 3,14-14) strip-top absoluteGrob[strip.absoluteGrob.177]
18 17 ( 4- 4,14-14) strip-top absoluteGrob[strip.absoluteGrob.225]
19 18 ( 5- 5,14-14) strip-top absoluteGrob[strip.absoluteGrob.273]
20 19 ( 3- 3,16-16) strip-top absoluteGrob[strip.absoluteGrob.183]
21 20 ( 4- 4,16-16) strip-top absoluteGrob[strip.absoluteGrob.231]
22 21 ( 5- 5,16-16) strip-top absoluteGrob[strip.absoluteGrob.279]
23 22 ( 3- 3,18-18) strip-top absoluteGrob[strip.absoluteGrob.189]
24 23 ( 4- 4,18-18) strip-top absoluteGrob[strip.absoluteGrob.237]
25 24 ( 5- 5,18-18) strip-top absoluteGrob[strip.absoluteGrob.285]
ggplot2 2.2.0
pg
TableGrob (11 x 21) "layout": 42 grobs
z cells name grob
28 2 ( 6- 6, 4- 4) strip-t-1 gtable[strip]
29 2 ( 6- 6, 6- 6) strip-t-2 gtable[strip]
30 2 ( 6- 6, 8- 8) strip-t-3 gtable[strip]
31 2 ( 6- 6,10-10) strip-t-4 gtable[strip]
32 2 ( 6- 6,12-12) strip-t-5 gtable[strip]
33 2 ( 6- 6,14-14) strip-t-6 gtable[strip]
34 2 ( 6- 6,16-16) strip-t-7 gtable[strip]
35 2 ( 6- 6,18-18) strip-t-8 gtable[strip]