ggplot2 对齐两个多面图的顶部

ggplot2 align top of two facetted plots

我需要排列两个分面图,如下所示:

d = data.frame(Index = LETTERS[1:5],x=1:5,y=1:5)
A = ggplot(subset(d,Index == 'A'),aes(x,y)) + 
  theme_bw() + 
  theme(axis.title.x = element_blank()) + 
  geom_point() + facet_wrap(~Index) + labs(title = "Title, The Title", 
                                           subtitle = "Subtitle, The Subtitle",
                                           y = "Side Axes")
B = ggplot(subset(d,Index != 'A'),aes(x,y)) +
  theme_bw() + 
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) + 
  geom_point() + facet_wrap(~Index) + labs(title = "", subtitle = "")
g = gridExtra::arrangeGrob(A,B,ncol=2,bottom="Bottom Axes")
grid.arrange(g)

产生以下内容:

从上面可以看出,绘图区域的顶部边缘之间存在轻微的错位。这是由标题和副标题中的 'commas' 引起的。

有谁知道如何强制顶部边缘对齐?我需要左边图的标题和副标题,右边有一个(空)标题和副标题。

这有点老套,但您可以在右侧使用与左侧相同的标题和副标题,但以白色字体打印。 :) 你说这是逗号的缘故,这样就解决了。

不是最令人满意的,但它完成了工作。

B = ggplot(subset(d,Index != 'A'),aes(x,y)) +
theme_bw() + 
theme(axis.title.x = element_blank(), axis.title.y = element_blank(), title = element_text(color = 'white')) + 
geom_point() + facet_wrap(~Index) +
labs(title = "Title, The Title", subtitle = "Subtitle, The Subtitle")

@CephBirk 的解决方案是一种聪明而简单的方法。对于这样的 hack 不起作用的情况,您可以从绘图中删除标题和 sub-title,而是为它们创建单独的 grobs,您可以使用 grid.arrange 与绘图一起布置它们和 arrangeGrob。在下面的代码中,我还在图 AB 之间添加了一个 nullGrob() 作为间隔符,这样右边的 x-label (1.50)左边的图没有被截断。

library(gridExtra)

A = ggplot(subset(d,Index == 'A'),aes(x,y)) + 
  theme_bw() + 
  theme(axis.title = element_blank()) + 
  geom_point() + facet_wrap(~Index) 

B = ggplot(subset(d,Index != 'A'),aes(x,y)) +
  theme_bw() + 
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) + 
  geom_point() + facet_wrap(~Index) 

grid.arrange(
  arrangeGrob(
    arrangeGrob(textGrob("Title, The Title", hjust=0), 
                textGrob("Subtitle, The Subtitle", hjust=0, gp=gpar(cex=0.8))),
    nullGrob(), ncol=2, widths=c(1,4)),
  arrangeGrob(A, nullGrob(), B, ncol=3, widths=c(8,0.1,8),
              left="Side Axes", bottom="Bottom Axes"), 
  heights=c(1,12))

egg::ggarrange(A, B, ncol=2, bottom="Bottom Axes")