ggplot中具有相同面板尺寸的gridExtra面板图

时间:2018-09-10 21:03:42

标签: r ggplot2 gridextra

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()的{​​{1}}等效,让我得到两个size = "last"宽度完全相同的对象(因此日期正确排列) ?

2 个答案:

答案 0 :(得分:1)

作为grid的替代方法,新的patchwork库可能在这里有所帮助。它可以与ggsave一起使用,并且可以很好地对齐绘图。

https://github.com/thomasp85/patchwork

patchwork::plot_layout(p1 / p2)

enter image description here

答案 1 :(得分:0)

我发现了一个使用egg软件包的解决方案,我认为它是ggplot2的一部分。我将采用这种方式来避免必须安装patchwork。看来您需要R 3.5+才能安装patchwork

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

Capture.png