以PDF格式绘制为位图

mar*_*syl 6 pdf graphics r bitmap

我目前正在处理CGH数组结果,该结果涉及数以万计的点的多个图,并且我想从PDF设备的多页功能和PNG图像格式的亮度中受益。

问题在于PDF设备将这些图存储为矢量图形,因此PDF文件很大,需要几分钟才能打开。我不知道R是否可以绘制为嵌入单个PDF文件中的多个位图,因为我知道PDF格式能够处理它。

这是一个简单的示例,PDF文件约为2 Mo,而png文件约为10 Ko,所以我想要一个20 Ko左右的PDF文件。

png("test%i.png")
plot(rnorm(2e4), rnorm(2e4), pch="+", cex=0.6)
plot(rnorm(2e4), rnorm(2e4), pch="+", cex=0.6)
dev.off()

pdf("test.pdf", onefile=TRUE)
plot(rnorm(2e4), rnorm(2e4), pch="+", cex=0.6)
plot(rnorm(2e4), rnorm(2e4), pch="+", cex=0.6)
dev.off()
Run Code Online (Sandbox Code Playgroud)

Spa*_*man 5

使用png驱动程序创建可接受分辨率的PNG文件。使你的情节。关闭png设备。

然后使用package:png中的readPNG读取它。

接下来打开PDF驱动程序,在(0,0)(1,1)处创建没有边距和边界的空白图,并使用rasterImage将png绘制为该图。通过创建新的图来添加额外的页面。关闭PDF驱动程序。

那应该为您提供带有图的位图版本的PDF。正确设置绘图有一些棘手的问题,而png分辨率至关重要,但我认为以上内容已经具备了所有要素。

> png("plot.png")
> makeplot(100000) # simple function that plots 100k points 
> dev.off()
X11cairo 
       2 
> plotPNG = readPNG("plot.png")
> pdf("plot.pdf")
> par(mai=c(0,0,0,0))
> plot(c(0,1),c(0,1),type="n")
> rasterImage(plotPNG,0,0,1,1)
> dev.off()
Run Code Online (Sandbox Code Playgroud)

然后检查plot.pdf ...


Jos*_*ien 3

这里有一个解决方案,可以让您接近 (50kb) 达到您想要的文件大小 (25kb),而不需要您安装 LaTeX 和/或学习 Sweave。(从长远来看,这两者都不受欢迎!)

它使用grid函数grid.cap()grid.raster()。更多细节和想法请参见Paul Murrell 最近在 R-Journal 上发表的文章(警告:PDF)

require(grid)
# Make the plots
dev.new()  # Reducing width and height of this device will produce smaller raster files
    plot(rnorm(2e4), rnorm(2e4), pch="+", cex=0.6)
    cap1 <- grid.cap()
    plot(rnorm(2e4), rnorm(2e4), pch="+", cex=0.6, col="red")
    cap2 <- grid.cap()
dev.off()

# Write them to a pdf
pdf("test.pdf", onefile=TRUE)
     grid.raster(cap1)
     plot.new()
     grid.raster(cap2)
dev.off()
Run Code Online (Sandbox Code Playgroud)

生成的pdf图像似乎比您的文件test1.png和保留更多细节test2.png,因此您可以通过降低其分辨率来更接近您的目标。