我必须创建一堆包含大量数据点的图表。到目前为止,我一直通过将它们全部绘制到一个
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
中(我认为对于这样一个简单的工作来说太乏味了),有没有办法做到这一点?
你可以
png
包将其读回并grid.arrange
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()
如果问题的根源是图中的点太多,那么您可能需要考虑使用六边形分箱而不是常规散点图。 您可以使用 bioconductor 的 hexbin 包,或者 ggplot2 包也具有六角形分箱功能。 无论哪种方式,当直接创建 pdf 文件时,您可能会得到更有意义的绘图以及更小的文件大小。
您可以使用 ImageMagick
将 PNG 文件转换为 PDFfor i in *.png
do
convert "$i" "$i".pdf
done
并将生成的文件与 pdftk 连接起来。
pdftk *.png.pdf output all.pdf
接受的答案按顺序写入和读取 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()