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
。在下面的代码中,我还在图 A
和 B
之间添加了一个 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")
我需要排列两个分面图,如下所示:
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
。在下面的代码中,我还在图 A
和 B
之间添加了一个 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")