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

RMarkdown PDF中ggplot2绘图并排及图注丢失问题求助

RMarkdown PDF并排ggplot2图且保留图注的解决办法

问题根源

  1. par(mfrow)对ggplot2无效:基础绘图依赖base绘图系统,par()是该系统的全局参数,但ggplot2基于grid绘图系统,完全不识别par(mfrow)这类布局设置,所以调用后不会生效。
  2. fig.show="hold"丢图注:这个参数会把代码块内的所有图合并成一个输出区块,但RMarkdown的图注是与代码块绑定的——一个代码块只能指定一个fig.cap,无法给多个图分别添加图注,最终就会出现单个图注丢失的情况。

可行解决方案

方法1:用patchwork包(推荐)

patchwork是专门用于拼接ggplot2图的工具,语法简洁,能灵活控制布局,同时支持给每个图添加单独标注:

library(ggplot2)
library(patchwork)

# 生成两个ggplot绘图对象
p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() + labs(title = "图1:mpg与wt的关系")
p2 <- ggplot(mtcars, aes(hp, qsec)) + geom_point() + labs(title = "图2:hp与qsec的关系")

# 横向并排拼接
p1 + p2 + plot_layout(ncol = 2)

如果需要给拼接后的整体加统一图注,直接在代码块中设置fig.cap即可;若要每个图的独立标注,用ggplot的labs()函数单独配置就行。

方法2:用LaTeX分栏(适合需独立图注的场景)

因为是PDF输出,直接借助LaTeX的minipage实现分栏,每个栏内放置一个独立代码块,这样每个图都能拥有专属的fig.cap:

\begin{minipage}{0.48\textwidth}
```{r plot1, fig.cap="图1:mpg与wt的散点图"}
ggplot(mtcars, aes(mpg, wt)) + geom_point()

\end{minipage}
\hfill % 添加空白分隔
\begin{minipage}{0.48\textwidth}

ggplot(mtcars, aes(hp, qsec)) + geom_point()

\end{minipage}

这种方式能完美保留每个图的独立图注,排版自由度也很高。

#### 方法3:用gridExtra包的grid.arrange
这是比较传统的ggplot拼接方式,同样能实现并排效果:
```r
library(ggplot2)
library(gridExtra)

p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p2 <- ggplot(mtcars, aes(hp, qsec)) + geom_point()

# 横向排列两个图
grid.arrange(p1, p2, ncol = 2)

可以通过代码块的fig.cap给拼接后的整体加统一图注,也能在每个ggplot对象中通过labs()设置单独标注。

内容的提问来源于stack exchange,提问作者Haribo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:42:17