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)
使用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 ...
这里有一个解决方案,可以让您接近 (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,因此您可以通过降低其分辨率来更接近您的目标。
| 归档时间: |
|
| 查看次数: |
2352 次 |
| 最近记录: |