如何在 a4 pdf 上放置多个 ggplot 图表?

how to fit multiple ggplot charts on a a4 pdf?

考虑这个简单的例子

library(dplyr)
library(ggplot)
library(patchwork)

mytib <- tibble(group = as.factor(c(1,1,1,1,2,2,2,2,3,3,3,3)),
       y = c(1,2,3,42,50,400,3,3,2,3,3,4),
       x = c('a','b','c','d','a','b','c','d','a','b','c','d'))


p1 <- mytib %>% ggplot(aes(x = x, y = y, fill = group)) +
  geom_col() + ggtitle('this is a messy chart')+
  coord_flip()+
  xlab('Hello') +
  ylab('This is a nice comment')

现在我使用 patchwork 合并图表,这样我就可以在常规 a4 pdf 页面

上获得 3 行,每行 3 个图表
(p1 + p1 + p1)/
(p1 + p1 + p1)/
(p1 + p1 + p1)

ggsave(file="a4_output.pdf", width = 210, height = 297, units = "mm")

输出是一个不错的 a4 pdf,但问题是 pdf 上的图表非常紧张。有没有办法保留它们的原始比例(在 pdf 上),使它们看起来不那么拉伸,甚至一行三个?我不介意它们看起来更小。

有什么想法吗? 谢谢!

问题是容积率的变化。现在,coord_flip 不适用于固定比率 - 但 - 使用 ggstance!!我稍微更改了情节,使用 geom_colh,切换了 x 和 y,并添加了固定比率。现在我们可以使用您的绘图布局,或者简单地将绘图打包在列表中并使用 wrap_plots。我没有使用 reprex 输出,因为我正在分享 pdf 输出的屏幕截图。

library(tidyverse)
library(patchwork)
library(ggstance)

mytib <- tibble(group = as.factor(c(1,1,1,1,2,2,2,2,3,3,3,3)),
                y = c(1,2,3,42,50,400,3,3,2,3,3,4),
                x = c('a','b','c','d','a','b','c','d','a','b','c','d'))

p1 <- 
  mytib %>% ggplot(aes(x = y, y = x, fill = group)) +
  geom_colh() + ggtitle('this is a messy chart')+
  coord_fixed(100)+
  xlab('Hello') +
  ylab('This is a nice comment')

plotlist <- list()
for(i in 1:9) { plotlist[[i]] <- p1 }

ggsave(plot = wrap_plots(plotlist), file="a4_output.pdf", width = 210, height = 297, units = "mm")

另一个解决方案 是添加另一行 - 不是空图,而是使用 plot_layout

(p1 + p1 + p1)/
  (p1 + p1 + p1)/
  (p1 + p1 + p1) +
  plot_layout(nrow = 4)