【问题标题】:R: Bitmap output in PDFR:PDF 格式的位图输出
【发布时间】:2014-12-10 09:23:29
【问题描述】:

很多时候,我发现使用pdf() 输出图形非常有用,因为它允许我滚动页面并观察细微差异(例如,页码可能对应于模拟中的特定参数)。

有时,如果绘图包含大量信息,PDF 是矢量图形这一事实意味着在 PDF 阅读器中加载需要很长时间,并且对于滚动页面毫无用处。我可以用png() 绘图,但这会产生很多图像文件。

我理想的解决方案是拥有一个可以将位图图形(例如 PNG)绘制为 PDF 的设备。

我读过cairo_pdf() 输出到位图有时?或者我可以写一些输出到 PNG 的东西,然后将它们组合成一个 PDF?

还有其他想法吗?或者有人已经有解决方案了吗?

【问题讨论】:

  • 检查dev.copy函数族,特别是dev.copy2pdf():stat.ethz.ch/R-manual/R-patched/library/grDevices/html/…。另外,请考虑请求版主将此问题迁移到 StackOverflow,因为它实际上是一个 R 问题,而不是统计问题。
  • 下一页上的解决方案之一有帮助吗? stackoverflow.com/q/8048984,特别是使用png 包中的readPNG 的解决方案帮助了我一次。
  • 谢谢@Ben,我会在某个时候尝试

标签: r data-visualization


【解决方案1】:

更新:现在添加了基于 readPNG() 的方法,如上面 cmets 中所建议的那样。它有点慢(3s vs 9s),并且似乎导致文件大小比 ImageMagick 稍大。 rasterImage() 插值对文件大小或时间没有影响,但会稍微改变外观。如果它是 FALSE,那么它看起来和 ImageMagick 一样

我刚刚使用 ImageMagick 提出了以下解决方案。它并不完美,但到目前为止似乎运行良好。

png2pdf <- function(name=NULL,removepngs=TRUE,method="imagemagick",pnginterpolate=FALSE){
  # Run the png() function with a filename of the form name%03d.png
    # Then the actual plotting functions, e.g. plot(), lines() etc.
    # Then dev.off()
    # Then run png2pdf() and specify the name= argument if other pngs exist in the directory

  # Need to incorporate a way of dealing with non-square plots

    if(is.null(name)){
        names <- list.files(pattern="[.]png")
        name <- unique(sub("[0-9][0-9][0-9][.]png","",names))
        if(length(name)!=1) stop("png2pdf() error: Check filenames")
    }else{
        names <- list.files(pattern=paste0(name,"[0-9][0-9][0-9][.]png"))
    }

    # Can change this to "convert" if it is correctly in the system path
  if(method=="imagemagick"){
    cmd <- c('C:\\Program Files\\ImageMagick-6.9.0-Q16\\convert.exe',names,paste0(name,".pdf"))
    system2(cmd[1],cmd[-1])
  }else if(method=="readPNG"){
    library(png)
    pdf(paste0(name,".pdf"))
    par(mar=rep(0,4))
    for(i in 1:length(names)){
      plot(c(0,1),c(0,1),type="n")
      rasterImage(readPNG(names[i]),0,0,1,1,interpolate=pnginterpolate)
    }
    dev.off()
  }
  if(removepngs) file.remove(names)
}

【讨论】:

  • 赞成这一点,尽管纯 R 解决方案会更优雅。
  • 同意纯 R 解决方案会更好。刚刚遇到了另一种使用ghostscript和imagemagick的方法:pdfconvert(source)
  • 有趣。但我仍然更喜欢纯 R 解决方案。何时/如果您有机会查看我建议的dev.copy2pdf(),请分享您对该方法的看法。
  • 嗨@Alek,我试过dev.copy2pdf(),但是它创建了一个矢量图形PDF,似乎没有任何选项可以以位图形式创建它
  • 嗨!感谢更新。这只是一个猜测,基于太快地阅读文档。您的原始解决方案和参考解决方案都很好 - 我只是不想依赖第三方工具。看来在这种情况下,这是唯一的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多