如何在R Markdown Beamer单张幻灯片中实现2×2布局的四张图表排版?
在R Markdown Beamer中实现2×2多图布局的可行方案
我明白你在R Markdown Beamer里排版2×2 ggplot图时遇到的麻烦了——之前用par(mfrow=c(2,2))完全没效果,试了ggarrange()、plot_grid()也没成功,大概率是几个关键细节没处理到位,下面给你一套绝对能跑通的方案:
问题根源
你用的par(mfrow)是base绘图系统的参数,但ggplot2属于grid绘图系统,两者完全不兼容,所以这个方法对ggplot图根本不起作用。另外,之前的代码里没有真正调用排版函数(你把ggarrange和plot_grid注释掉了),而且可能没调整幻灯片的图尺寸,导致图显示异常。
完整可运行代码
直接替换你原来的代码块就行,我已经把所有细节都调整好了:
# 先加载所有依赖包,放在最前面避免报错 library(tidyverse) library(haven) library(ggplot2) library(ggpubr) library(cowplot) library(extrafont) library(gridExtra) # 读取数据并处理因子变量 df <- read_dta(file = "aaa.dta") df$fchaebol <- factor(df$chaebol) # 直接在数据框内转换,更整洁 # 生成四个ggplot折线图 p1 <- ggplot(df,aes(x= year, y= asset, color = fchaebol, linetype = fchaebol)) + theme_bw() + stat_summary(geom = "line", fun = mean) # 注意:ggplot2 3.0+版本用fun替代旧的fun.y p2 <- ggplot(df,aes(x= year, y= liability, color = fchaebol, linetype = fchaebol)) + theme_bw() + stat_summary(geom = "line", fun = mean) p3 <- ggplot(df,aes(x= year, y= sales, color = fchaebol, linetype = fchaebol)) + theme_bw() + stat_summary(geom = "line", fun = mean) p4 <- ggplot(df,aes(x= year, y= equity, color = fchaebol, linetype = fchaebol)) + theme_bw() + stat_summary(geom = "line", fun = mean) # 用ggpubr的ggarrange实现2×2布局,共享图例让布局更紧凑 ggarrange(p1, p2, p3, p4, ncol = 2, nrow = 2, common.legend = TRUE, legend = "bottom") # 图例放在底部,不占用子图空间 # 如果你更喜欢cowplot的风格,也可以用下面的plot_grid(注释掉上面的ggarrange即可) # plot_grid(p1, p2, p3, p4, # ncol = 2, # labels = c("A", "B", "C", "D"), # 给子图加标签 # label_size = 10)
关键注意事项
- 彻底删掉
par(mfrow=c(2,2)),它和ggplot完全不兼容 - 一定要调整
fig.width和fig.height参数:Beamer幻灯片通常是4:3或16:9比例,设置fig.width=8, fig.height=6是4:3的黄金比例,刚好能让四张图填满幻灯片,不会太挤或太小 - ggplot2 3.0版本之后,
fun.y参数已经被废弃,改成fun = mean可以避免警告 - 用
common.legend = TRUE合并图例,能大大节省子图空间,让每个图的显示面积更大
内容的提问来源于stack exchange,提问作者jck21
相关产品推荐
相关产品推荐

