我想要两个单独的图。我在一个投影仪演示的不同帧中使用它们,我将向另一个添加一行(最终,不在下面的示例中)。因此,我不希望演示文稿跳过"跳过" ("跳过"?)从一张幻灯片到下一张幻灯片。我希望它看起来像是自然添加的线。我认为以下代码显示了问题。这是微妙的,但不是如何第二个图的绘图区域略大于第一个图。这是因为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?
它们对我不起作用,主要是因为我需要单独的绘图,因此不需要在一个组合图上对它们进行良好的对齐,就像上面的一些解决方案一样。
答案 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"
。