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

如何在R Markdown中用网格排列PNG并支持LaTeX subref引用

解决方案

要实现用LaTeX subref 包引用子图,核心是让knitr/bookdown生成带子图结构的LaTeX代码,而非将所有图拼成单一栅格图(这会丢失子图标签信息)。具体操作如下:

关键逻辑

之前用cowplot拼接的方式会把三个图合并成一个独立ggplot对象,knitr仅输出一个figure环境,无法生成subfigure子环境,因此无法用subref引用子图。我们需要让每个子图独立输出,由knitr自动生成subfigure结构。

步骤1:调整代码块参数

修改knitr参数,指定子图副标题、输出宽度以控制布局:

  • fig.subcap:为每个子图设置副标题,自动生成(a)(b)(c)标签
  • out.width:控制子图宽度,第一张占100%(整行),第二、三张各占50%(并排)
  • fig.cap:设置整体图标题

步骤2:重写R代码(移除cowplot拼接)

直接输出每个独立图对象,不再用cowplot拼接:

---
title: "Grid"
output:
  bookdown::pdf_document2:
    template: NULL
    keep_tex: true
    number_sections: false
    latex_engine: pdflatex
header-includes:
  - \usepackage[subrefformat=simple]{subfig}
--- 
```{r label, echo = FALSE, warning=FALSE}
#| fig.cap: "整体图标题"
#| fig.align: "center"
#| fig.subcap: ["Figure1", "Figure2", "Figure3"]
#| out.width: ["100%", "50%", "50%"]
library(magick)
library(ggplot2) # 注意:原代码的ggplot应为ggplot2

# 加载PNG图片
png_image1 <- image_read("images/rectangle.png")
png_image2 <- image_read("images/square1.png")
png_image3 <- image_read("images/square2.png")

# 转换为ggplot对象
im1 <- image_ggplot(png_image1)
im2 <- image_ggplot(png_image2)
im3 <- image_ggplot(png_image3)

# 依次输出三个子图
print(im1)
print(im2)
print(im3)
## 步骤3:引用子图
在文档文本中,直接使用LaTeX的`subref`命令引用子图:
- 引用第一个子图:`\subref*{fig:label-1}`
- 引用第二个子图:`\subref*{fig:label-2}`
- 引用第三个子图:`\subref*{fig:label-3}`

生成的PDF中,子图标签会与文档其他子图格式一致,且支持`subrefformat=simple`设置的无括号引用样式。

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

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

最近更新时间:2026.07.11 01:20:36