You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R Markdown PDF输出:同页2×2布局展示带独立标题的多图

嘿,我刚好碰到过类似的需求,给你几个靠谱的解决方案,帮你在R Markdown的PDF报告里实现2×2布局+每个图表独立标题的效果!

方法1:用gridExtra给每个子图添加独立标题

其实grid.arrange是支持给每个子图加标题的,只是需要把标题和图表组合成一个grob对象来实现。举个实操例子:

library(gridExtra)
library(ggplot2)
library(grid)

# 创建4个示例图表
p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p2 <- ggplot(mtcars, aes(mpg, hp)) + geom_point()
p3 <- ggplot(mtcars, aes(disp, wt)) + geom_point()
p4 <- ggplot(mtcars, aes(qsec, hp)) + geom_point()

# 给每个图表绑定独立标题,组合成带标题的grob
g1 <- arrangeGrob(p1, top = textGrob("油耗与车重关系", gp = gpar(fontsize=12, fontface="bold")))
g2 <- arrangeGrob(p2, top = textGrob("油耗与马力关系", gp = gpar(fontsize=12, fontface="bold")))
g3 <- arrangeGrob(p3, top = textGrob("排量与车重关系", gp = gpar(fontsize=12, fontface="bold")))
g4 <- arrangeGrob(p4, top = textGrob("加速时间与马力关系", gp = gpar(fontsize=12, fontface="bold")))

# 按2×2矩阵布局排列
grid.arrange(g1, g2, g3, g4, ncol=2, nrow=2)

如果你用的是ggplot图表,也可以直接在ggplot代码里加ggtitle("你的标题"),再用grid.arrange排列,效果一样;用textGrob的好处是能更灵活调整标题的字体、大小样式。

方法2:用ggpubr的ggarrange(更简单直观)

ggpubr包的ggarrange就是专门为多图布局设计的,支持直接给每个子图指定标题,语法友好到不用额外处理grob:

library(ggpubr)
library(ggplot2)

# 创建示例图表
p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p2 <- ggplot(mtcars, aes(mpg, hp)) + geom_point()
p3 <- ggplot(mtcars, aes(disp, wt)) + geom_point()
p4 <- ggplot(mtcars, aes(qsec, hp)) + geom_point()

# 2×2布局+独立标题配置
ggarrange(p1, p2, p3, p4,
          ncol = 2, nrow = 2,
          labels = c("油耗与车重关系", "油耗与马力关系", "排量与车重关系", "加速时间与马力关系"),
          font.label = list(size = 12, face = "bold"))

这个方法我自己做报告经常用,直接通过labels参数设置每个图的标题,还能通过font.label一键调整标题样式,在R Markdown生成PDF的适配性特别好。

方法3:用patchwork包(语法简洁的现代ggplot工具)

patchwork是ggplot生态里的新工具,用起来像搭积木一样简洁,支持用类似ggplot的语法组合图表:

library(patchwork)
library(ggplot2)

# 创建带独立标题的图表
p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() + ggtitle("油耗与车重关系")
p2 <- ggplot(mtcars, aes(mpg, hp)) + geom_point() + ggtitle("油耗与马力关系")
p3 <- ggplot(mtcars, aes(disp, wt)) + geom_point() + ggtitle("排量与车重关系")
p4 <- ggplot(mtcars, aes(qsec, hp)) + geom_point() + ggtitle("加速时间与马力关系")

# 按2×2布局组合:+横向拼,/纵向拼
(p1 + p2) / (p3 + p4)

这种语法非常直观,不需要记复杂的参数,而且还能灵活调整每个子图的宽度、高度比例,适配不同的PDF页面需求。

R Markdown代码块选项补充

在R Markdown里,你可以通过代码块参数调整整个布局的尺寸,让PDF里的图表更美观:

```{r fig.width=10, fig.height=8, echo=FALSE}
# 这里放上面任意一种布局的代码
`fig.width`和`fig.height`控制整体图表的宽高,`echo=FALSE`可以隐藏代码块,只显示生成的图表。

内容的提问来源于stack exchange,提问作者shashwat vajpeyi
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:50:37