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
相关产品推荐
相关产品推荐

