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

Mac系统下RMarkdown生成PDF图片过度裁剪问题问询

Mac下RMarkdown编译PDF时图片过度裁剪问题

重现代码

---
title: "Untitled"
author: "Richard D. Morey"
date: '2022-07-24'
output: 
  pdf_document:
    keep_tex: false
    fig_crop: true
---

```{r setup, include=FALSE}
library(ggplot2)
library(patchwork)
knitr::opts_chunk$set(echo = FALSE, dev=c('pdf', 'png'))
ggplot(data=mtcars, aes(x=mpg,y=disp)) +
  geom_point() +
  annotate(
    'text',x=20,y=200,label='hi there 0', color = 'red'
    ) -> gg0
ggplot(data=mtcars, aes(x=mpg,y=disp)) +
  geom_point() +
  annotate(
    'text',x=20,y=200,label='hi there 1', color = 'blue'
    )  -> gg1
gg0
gg1
gg0 + gg1
## 问题现象
开启默认的`fig_crop:true`选项后,Mac环境编译出现以下异常:
- 前两张独立ggplot图片被过度裁剪,坐标轴丢失;但导出的PNG图片无此问题
- patchwork拼接生成的`gg0+gg1`仅显示左侧面板,轴标签因过度裁剪丢失

## 相关影响因素
- 基础R绘图同样出现该问题
- 调换`dev`列表顺序为`c('png', 'pdf')`,优先使用PNG时显示正常但分辨率偏低
- 设置`fig_crop: false`可直接解决问题
- 使用`cairo_pdf`替代默认`pdf`设备可解决问题
- 控制台直接执行`ggplot2::ggsave('test.pdf', plot = gg0, device = 'pdf')`保存无此问题
- 无论是否安装`{magick}`包,问题均存在
- 该问题在Windows及Rstudio.cloud(Ubuntu)环境下未出现
- 已有其他用户遇到同类问题

## 会话信息
```r
sessioninfo::session_info()
─ Session info ─────────────────────────────────────────────────────────
 setting  value                       
 version  R version 4.2.1 (2022-06-23)
 os       macOS Big Sur 11.6.7         
 system   x86_64, darwin17.0           
 ui       RStudio                     
 language (EN)                        
 collate  en_GB.UTF-8                  
 ctype    en_GB.UTF-8                  
 tz       Europe/London                
 date     2022-07-25                  

─ Packages ─────────────────────────────────────────────────────────────
 !  package     * version date       lib source         
    cli           3.0.0   2021-06-30 [2] CRAN (R 4.2.0)
    digest        0.6.27  2020-10-24 [2] CRAN (R 4.2.0)
    evaluate      0.14    2019-05-28 [2] CRAN (R 4.2.0)
    htmltools     0.5.1.1 2021-01-22 [2] CRAN (R 4.2.0)
    knitr         1.33    2021-04-24 [2] CRAN (R 4.2.0)
    renv          0.15.5  2022-05-26 [1] CRAN (R 4.2.0)
 VP rlang         0.4.11  2022-07-12 [2] CRAN (R 4.2.0)
 P  rmarkdown     2.14    2022-04-25 [?] CRAN (R 4.2.0)
    rstudioapi    0.13    2020-11-12 [2] CRAN (R 4.2.0)
    sessioninfo   1.1.1   2018-11-05 [2] CRAN (R 4.2.0)
    withr         2.4.2   2021-04-18 [2] CRAN (R 4.2.0)
 P  xfun          0.31    2022-05-10 [?] CRAN (R 4.2.0)
    yaml          2.2.1   2020-02-01 [2] CRAN (R 4.2.0)

[1] /Users/richard/Downloads/test_crop/renv/library/R-4.2/x86_64-apple-darwin17.0
[2] /Library/Frameworks/R.framework/Versions/4.2/Resources/library

 V ── Loaded and on-disk version mismatch.
 P ── Loaded and on-disk path mismatch.

问题根源

该问题为Mac系统下{rmarkdown}/{knitr}使用默认pdf()设备时的特有兼容性问题,推测与Mac系统自带的PDF裁剪工具配置、或R默认PDF设备生成的文件边界框信息与knitr裁剪逻辑不匹配有关,导致knitr调用裁剪工具时无法正确识别图片有效区域,进而过度裁剪。

解决方案

  1. 关闭自动裁剪:在YAML输出设置中修改fig_crop: false,跳过裁剪步骤
  2. 替换PDF设备:将绘图设备改为cairo_pdf,可在setup代码块中全局设置:
    knitr::opts_chunk$set(echo = FALSE, dev=c('cairo_pdf', 'png'))
    
    或在YAML中直接指定:
    output:
      pdf_document:
        dev: cairo_pdf
    
  3. 手动处理拼接图:若仅patchwork拼接图异常,可手动保存后再导入文档,避免knitr自动裁剪:
    ggplot2::ggsave('patchwork_plot.pdf', plot = gg0 + gg1, device = 'pdf')
    
    随后在文档中用![patchwork plot](patchwork_plot.pdf)插入图片

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:54:16