RMarkdown PDF中ggplot2绘图并排及图注丢失问题求助
RMarkdown PDF并排ggplot2图且保留图注的解决办法
问题根源
par(mfrow)对ggplot2无效:基础绘图依赖base绘图系统,par()是该系统的全局参数,但ggplot2基于grid绘图系统,完全不识别par(mfrow)这类布局设置,所以调用后不会生效。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
相关产品推荐
相关产品推荐

