指定ggplot2面板的宽度

12

我在同一页上有两个ggplot图,希望它们的面板宽度相同。

一些示例数据:

dfr1 <- data.frame(
  time = 1:10,
  value = runif(10)  
)

dfr2 <- data.frame(
  time = 1:10,
  value = runif(10, 1000, 1001)  
)

一个图形在另一个下方:

p1 <- ggplot(dfr1, aes(time, value)) + geom_line()
p2 <- ggplot(dfr2, aes(time, value)) + geom_line()

grid.newpage()
pushViewport(viewport(layout = grid.layout(2, 1)))   
print(p1, vp = viewport(layout.pos.row = 1, layout.pos.col = 1))         
print(p2, vp = viewport(layout.pos.row = 2, layout.pos.col = 1))

如何在每个绘图中指定面板的宽度和位置,以使它们对齐?

(我不想使用分面将绘图合并;在我的实际示例中不适用。)


我不知道具体细节,但是gridExtra可能有一些帮助:http://cran.r-project.org/web/packages/gridExtra/gridExtra.pdf - Chase
1
这肯定会有所帮助:https://dev59.com/ImYr5IYBdhLWcg3w6eQ3 - Etienne Low-Décarie
@EtienneLow-Décarie -- 是的,很好的发现!这基本上就是答案。不过,如果要将其用作不止一次(并且可能用于多个图形),最好有一个函数来封装这些步骤。 - Josh O'Brien
1个回答

13

原始解决方案:

 #   install.packages("ggExtra", repos="http://R-Forge.R-project.org")
 #   library(ggExtra)
 #   align.plots(p1, p2)

编辑(2022年3月13日):

由于ggExtra不再存在(并且ggplot2的许多内部已经更改),因此最好使用gtable包提供的合并函数(rbind,cbind)。

gl = lapply(list(p1,p2), ggplotGrob)     
library(gtable)
g = do.call(rbind, c(gl, size="first"))
g$widths = do.call(unit.pmax, lapply(gl, "[[", "widths"))

grid.newpage()
grid.draw(g)    

这里输入图片描述


刚刚意识到你在之前的问题中提到了 align.plots。https://dev59.com/NVXTa4cB1Zd3GeqP2YNP 我保证这次我会记住它! - Richie Cotton
ggExtra已经不再在线(https://groups.google.com/forum/?fromgroups#!topic/ggplot2-dev/4dKg-qA7eZE)。 - Etienne Low-Décarie
确实,这个软件包已经被淘汰了。 - baptiste
1
@baptiste感谢您的编辑。您确定不想将此作为新答案发布吗? - Andrie
我最初发布了一个包含完整代码的答案,但是你的代码仍然需要编辑。现在这样也可以(至少暂时可以,直到代码再次出问题...)。 - baptiste

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