【问题标题】:Saving graphs in both pdf and png format but using pdf files in the final document以 pdf 和 png 格式保存图形,但在最终文档中使用 pdf 文件
【发布时间】:2012-03-28 09:21:57
【问题描述】:

我使用knitr 进行分析。我可以使用\SweaveOpts{dev=pdf} 以pdf 格式保存图形,使用\SweaveOpts{dev=png} 以png 格式保存图形。我有兴趣在一次运行中以 pdf 和 png 格式保存图形,但在最终文档中交互使用 pdf。任何建议将不胜感激。谢谢

【问题讨论】:

  • 每个块有多个地块吗?如果你不这样做,我可以通过块挂钩向你展示一个简单的方法;如果你这样做,我将需要更改内部代码以允许每个块有多个设备,例如dev=c('pdf', 'png').
  • 感谢@Yihui 的评论。是的,我确实每个块有多个地块。
  • 下面的答案是一个通用的解决方案,每个块不需要一个 plot,我会考虑如何在 knitr 中为多个设备添加原生支持;也许这可以在 knitr 0.4 中完成。
  • 那太好了。感谢一辉的好作品。
  • 好的,我现在已经实现了对多设备的支持。请参阅下面的修改答案。

标签: r knitr


【解决方案1】:

真正的解决方案来了:

Knitr 0.3.9 开始支持每个块多个设备(目前,您必须从 GitHub 安装);在您的情况下,您可以设置块选项 dev=c('pdf', 'png') 来获取 PDF 和 PNG 文件。


这是一个使用 ImageMagick 将 PDF 文件转换为 PNG 的解决方案。当然你得先安装ImageMagick,并确保它的bin目录在PATH:

knit_hooks$set(convert = function(before, options, envir) {
  # quit if before a chunk or no figures in this chunk
  if (before || (n <- options$fig.num) == 0L) return()
  # only convert pdf files
  if (options$fig.ext != 'pdf') return()

  # use ImageMagick to convert all pdf to png
  name = fig_path()  # figure filename
  owd = setwd(dirname(name)); on.exit(setwd(owd))
  files = paste(basename(name), if (n == 1L) '' else seq(n), sep = '')
  lapply(files, function(f) {
    system(sprintf('convert %s.pdf %s.png', f, f))
  })
  NULL
})

基本上这个钩子在一个块之后执行,并在所有 PDF 图形上运行convert foo.pdf foo.png。你可以像这样使用它

<<test-png, convert=TRUE>>=
  plot(1); plot(2)
@

或者,如果您将所有图形放在单独的目录中,您可以直接在该目录中运行 convert(即不必在 R 中调用 system())。

这不是一个理想的解决方案,但应该可以。要使用 R 的原生 png() 设备,您需要先在上面的评论中回答我的问题。

【讨论】:

  • 假设使用 Rnw 文件并生成 pdf 文档:是否可以选择指定哪些文件将用于生成文档?我有一个包含大量图形的 rpeort,并想准备它的高分辨率和低分辨率(即一个使用 png 和一个 pdf)。
  • @radek 你可以用 LaTeX 技巧做到这一点:en.wikibooks.org/wiki/LaTeX/Importing_Graphics
  • 感谢您的快速回答。我看到生成的tex 文件没有指定图形的扩展名。 \DeclareGraphicsExtensions{.pdf} 之类的东西会仅生成带有 pdf 图像的报告吗?然后 - 我仍然需要编译两个单独的 tex 文档 - 一个带有 pdf 选项,一个带有 png?
  • @radek \DeclareGraphicsExtensions 是关键。你当然可以自动化它。没有什么能阻止勇敢的程序员。如果需要,您可以发布新问题。
猜你喜欢
  • 2015-02-25
  • 2018-10-18
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多