在 R 中将 png 绘图写入 pdf 文件

问题描述 投票:0回答:4

我必须创建一堆包含大量数据点的图表。到目前为止,我一直通过将它们全部绘制到一个

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
中(我认为对于这样一个简单的工作来说太乏味了),有没有办法做到这一点?

r pdf plot png graphic
4个回答
17
投票

你可以

  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()

6
投票

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


3
投票

您可以使用 ImageMagick

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

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

pdftk *.png.pdf output all.pdf

0
投票

接受的答案按顺序写入和读取 png 文件。我想在它写完之后很久再读它。所以我使用了这个解决方案:

pdf("testgraph.pdf")
p1 <- readPNG("testgraph.png", native = FALSE)
grid.raster(p1, width=unit(0.5, "npc"), height= unit(0.7, "npc"))
dev.off()

如果有多个 png 文件要写入不同页面中的 pdf 文件,则可以在

plot.new()
循环中使用
for
for
循环的效率低于 R 中的替代方案,但可能更容易解释概念) .

pdf("testgraph.pdf")
for (i in 1:nFiles) {
    p1 <- readPNG(paste0("testgraph",i,".png"), native = FALSE)
    grid.raster(p1, width=unit(0.5, "npc"), height= unit(0.7, "npc"))
    plot.new()
}
dev.off()
© www.soinside.com 2019 - 2024. All rights reserved.