ggplot 中具有相同面板大小的 gridExtra 面板图

gridExtra panel plot with identical panel sizes in ggplot

library(tidyverse)
library(grid)
df <- tibble(
  date = as.Date(40100:40129, origin = "1899-12-30"), 
  value = rnorm(30, 8)
  )

p1 <- ggplot(df, aes(date, value)) + 
  geom_line() + 
  scale_x_date(date_breaks = "1 day") + 
  theme(
    axis.title.x = element_blank(), 
    axis.text.x = element_text(angle = 90, vjust = 0.5)
  ) + 
  coord_cartesian(xlim = c(min(df$date) + 0, max(df$date) - 0))

p2 <- ggplot(df, aes(date, value)) + 
  geom_bar(stat = "identity") + 
  scale_x_date(date_breaks = "1 day") + 
  theme(
    axis.title.x = element_blank(), 
    axis.text.x = element_text(angle = 90, vjust = 0.5)
  ) + 
  coord_cartesian(xlim = c(min(df$date) + 0, max(df$date) - 0))

让我们创建如上所示的绘图 p1p1。我可以将这些堆叠在一起绘制,宽度完全相同(缩放到全屏以使其明显)。请注意,日期排列完美。代码直接在下面。

grid.newpage()
grid.draw(rbind(ggplotGrob(p1), ggplotGrob(p2), size = "last"))

不幸的是,我不能将 ggsave() 与上面的代码块一起使用,所以我转到 gridExtra 包。

gridExtra::grid.arrange(p1, p2)

这几乎可行,但请注意日期并没有完全对齐,以垂直方式比较顶部图表和底部图表。 所以... 什么等同于 rbind()s size = "last" 让我得到两个宽度完全相同的 grid.arrange' 对象(所以日期行正常)?

作为 grid 的替代品,新的 patchwork 库可能会在此处提供帮助。它与 ggsave 配合使用,可以很好地对齐图。

https://github.com/thomasp85/patchwork

patchwork::plot_layout(p1 / p2)

我发现了一个使用 egg 包的解决方案,我认为它包含在 ggplot2 中。我将走这条路以防止必须安装 patchwork。看来您需要 R 3.5+ 才能安装 patchwork.

egg::ggarrange(p1, p2)
p <- egg::ggarrange(p1, p2)
ggsave(plot = p, "panel-plot.png")