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

5
我希望为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))

以上代码给绘图的每一行分配了独特的高度:

enter image description here

我想知道是否有可能为绘图的每一行分配一个独特的宽度,而不是为每一行分配一个独特的高度。任何 ggplot2 扩展是否可以实现这一点?


1
你打算如何处理这些宽度?你想在每一行上添加更多的图还是仅仅为了视觉效果?其中一个想法可能是给每个图添加边距。可以像这样做:plot1 <- ggplot(mydf, aes(X, Y)) + geom_point() +theme( plot.margin = unit(c(1,10,1,1), "lines")) 其中 plot.margin 中的 10 可以被理解为你的右边距,也可以看作是你的宽度。 - Mike H.
感谢@MikeyMike,本质上的目标是使每个分面的x轴具有n个单位,其中n是该分面的观察数量。每个单位应由一致的空间表示,因此可视化更多观察结果的分面应具有物理上更长的x轴。如果我将每个分面的宽度设置为相对于最大长度的长度函数,则边距技巧可能有效!我要尝试一下这个... - duhaime
1
我相信这样的代码可以实现:plot1 <- ggplot(mydf, aes(X, Y)) + geom_point() +theme( plot.margin = unit(c(0.01,0.5,0.01,0.01), "npc")) 其中的 0.5 大致等于你所说的百分比。 - Mike H.
是的!npc正是我正在寻找的(我应该使用grep查找)。如果你把你最后的评论标记为答案,我会热情地接受! - duhaime
或许相关的链接:https://dev59.com/TlwY5IYBdhLWcg3weXvV#32583612 - baptiste
显示剩余3条评论
2个回答

2

如果您使用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中使用npc作为我们感兴趣的单位时,我们是相对于页面宽度进行设置的。 0.50.2对应右边距。随着npc的增加,您的绘图将变得更小。

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

enter image description here


2

另一个选项是使用nullGrob(一个空的grob,只占据空间)来分配给定行中的水平空间。例如:

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))

enter image description here


或者 grid.arrange(p1, p2, layout_matrix = matrix(c(1,2,NA,2), 2)) - baptiste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接