将png图写入R中的pdf文件

时间:2013-09-17 14:18:14

标签: r pdf plot png graphic

我必须创建一堆包含大量数据点的图表。到目前为止,我一直在将所有这些绘制成一个pdf - 文件:

pdf("testgraph.pdf")  
par(mfrow=c(3,3))

for (i in 2:length(names(mtcars))){
  plot(mtcars[,1], mtcars[,i])
}

dev.off()

但是,对于大量数据点,pdf文件变得太大。由于我对优秀品质不感兴趣,我不在乎我的情节是否是矢量图形。所以我想把这些图创建为png,然后将它们插入到pdf文件中。有没有办法做到这一点,除了创建R图表并将其插入pdf knitr之外(我认为这对于这么简单的工作来说太繁琐了)?

3 个答案:

答案 0 :(得分:15)

你可以

  1. 创建每个情节的.png文件
  2. 使用png包来读取这些内容和
  3. 使用grid.arrange
  4. 在pdf中绘制它们
    library(png)
    library(grid)
    library(gridExtra)
    
    thePlots <- lapply (2:length(names(mtcars)), function(i) {
      png("testgraph.png")
      plot(mtcars[,1], mtcars[,i])
    
      dev.off()
      rasterGrob(readPNG("testgraph.png", native = FALSE),
        interpolate = FALSE)
    })
    
    pdf("testgraph.pdf")
    do.call(grid.arrange, c(thePlots, ncol = 3))
    dev.off()
    

答案 1 :(得分:5)

如果问题的根源是图中的点太多,那么您可能需要考虑使用六边形分级而不是常规的散点图。您可以使用bioconductor中的hexbin包,或者ggplot2包也具有六边形装箱功能。无论哪种方式,在直接创建pdf文件时,您可能会获得更有意义的绘图以及更小的文件大小。

答案 2 :(得分:3)

您可以使用ImageMagick

将PNG文件转换为PDF
for i in *.png
do
  convert "$i" "$i".pdf
done

并将生成的文件与pdftk连接起来。

pdftk *.png.pdf output all.pdf