在两个图之间保持ggplot2中所有绘图组件的大小相同

时间:2014-07-12 03:20:44

标签: r ggplot2

我想要两个单独的图。我在一个投影仪演示的不同帧中使用它们,我将向另一个添加一行(最终,不在下面的示例中)。因此,我不希望演示文稿跳过"跳过" ("跳过"?)从一张幻灯片到下一张幻灯片。我希望它看起来像是自然添加的线。我认为以下代码显示了问题。这是微妙的,但不是如何第二个图的绘图区域略大于第一个图。这是因为y轴标签。

library(ggplot2)

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() + scale_y_continuous(breaks = NULL) + scale_x_continuous(breaks = NULL) + ylab(expression(hat(z)==hat(gamma)[1]*time+hat(gamma)[4]*time^2))
print(p1)
dev.new()
p2 <- ggplot(dfr2, aes(time, value)) + geom_line() + scale_y_continuous(breaks = NULL) + scale_x_continuous(breaks = NULL) + ylab(".")
print(p2)

我宁愿没有一个hackish解决方案,例如手动设置轴标签的大小或在x轴上添加空格(参见下面的一个参考),因为我将在几个设置中使用此技术,标签可以随时改变(我喜欢再现性,所以想要一个灵活的解决方案)。

我经常搜索并找到以下内容:

Specifying ggplot2 panel width

How can I make consistent-width plots in ggplot (with legends)?

https://groups.google.com/forum/#!topic/ggplot2/2MNoYtX8EEY

How can I add variable size y-axis labels in R with ggplot2 without changing the plot width?

它们对我不起作用,主要是因为我需要单独的绘图,因此不需要在一个组合图上对它们进行良好的对齐,就像上面的一些解决方案一样。

2 个答案:

答案 0 :(得分:11)

没试过,但这可能有用,

gl <- lapply(list(p1,p2), ggplotGrob)
library(grid)
widths <- do.call(unit.pmax, lapply(gl, "[[", "widths"))
heights <- do.call(unit.pmax, lapply(gl, "[[", "heights"))
lg <- lapply(gl, function(g) {g$widths <- widths; g$heights <- heights; g})
grid.newpage()
grid.draw(lg[[1]])
grid.newpage()
grid.draw(lg[[2]])

答案 1 :(得分:2)

如何将此用于p2:

p2 <- ggplot(dfr2, aes(time, value)) + geom_line() + 
  scale_y_continuous(breaks = NULL) + 
  scale_x_continuous(breaks = NULL) + 
  ylab(expression(hat(z)==hat(gamma)[1]*time+hat(gamma)[4]*time^2)) +
  theme(axis.title.y=element_text(color=NA))

它与p1具有相同的标签,但颜色为NA,因此不显示。您也可以使用color="white"