为 facet_grid / facet_wrap 图的每一行分配唯一的宽度

Assign unique width to each row of a facet_grid / facet_wrap plot

我希望在 R 中为一列的每一行分配一个自定义宽度,多面包裹图。(我知道这完全是非标准的。)

使用 grid.arrange 我可以使用以下代码片段为多面包裹的每一行分配一个唯一的高度:

group1 <- seq(1, 10, 2)
group2 <-  seq(1, 20, 3)
x = c(group1, group2)
mydf <- data.frame (X =x , Y = rnorm (length (x),5,1), 
                    groups = c(rep(1, length (group1)), rep(2, length(group2))))

plot1 <- ggplot(mydf, aes(X, Y)) + geom_point()
plot2 <- ggplot(mydf, aes(X, Y)) + geom_point()

grid.arrange(plot1, plot2, heights=c(1,2))

上面的代码为绘图的每一行赋予了唯一的高度:

我想知道是否可以为绘图的每一行分配一个唯一的 宽度,而不是为每一行分配一个唯一的高度。任何 ggplot2 扩展都可以吗?

是的,如果您在 ggplot theme() 中使用 plot.margin 功能,这是可能的。您可以通过执行以下操作将每个绘图宽度设置为页面总长度的百分比:

plot1 <- ggplot(mydf, aes(X, Y)) + geom_point()+theme( plot.margin = unit(c(0.01,0.5,0.01,0.01), "npc"))
plot2 <- ggplot(mydf, aes(X, Y)) + geom_point()+theme( plot.margin = unit(c(0.01,0.2,0.01,0.01), "npc"))

当我们在 plot.margin 调用中使用 npcs 作为我们感兴趣的单位时,我们是相对于页面宽度进行设置的。 0.50.2 对应右边距。随着 npc 的增加,您的绘图将变得越小。

grid.arrange(plot1, plot2, heights=c(1,2))

作为另一种选择,您可以使用 nullGrob(只占用 space 的空白 grob)在给定行中分配水平 space。例如:

library(gridExtra)
library(grid)

plot1 <- ggplot(mydf, aes(X, Y)) + geom_point()
plot2 <- ggplot(mydf, aes(X, Y)) + geom_point()

grid.arrange(arrangeGrob(plot1, nullGrob(), widths=c(1,1)), 
             plot2, heights=c(1,2))