我目前正在研究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()
答案 0 :(得分:4)
使用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()
然后检查plot.pdf ...
答案 1 :(得分:3)
这是一个让您接近(50kb)所需文件大小(25kb)的解决方案,无需安装LaTeX和/或学习Sweave。 (从长远来看,这些都不是不可取的!)
它使用grid
函数grid.cap()
和grid.raster()
。更多详情和想法见a recent R-Journal article by Paul Murrell (warning : 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()
生成的pdf
图片似乎比您的文件test1.png
和test2.png
保留更多详细信息,因此您可以通过缩减分辨率来更接近目标。
答案 2 :(得分:1)
要在pdf中加入多个图,请设置onefile = TRUE
。
pdf("test.pdf", onefile = TRUE)
plot(1:5)
plot(6:10)
dev.off()
要制作这些图PNG而不是原生PDF图需要更多的努力。将所有绘图创建为PNG,如下所示:
png("test%01d.png")
plot(1:5)
plot(6:10)
dev.off()
然后创建包含这些PNG的LaTeX文档。你可以通过使用Sweave从R那里做到这一点(但是如何做到这一点足以成为它自己的问题)。有一个不错的介绍性示例here。
答案 3 :(得分:0)
Swea解决方案怎么样?
\documentclass[a4paper]{article}
\usepackage[OT1]{fontenc}
\usepackage{Sweave}
\SweaveOpts{pdf = FALSE, eps = FALSE}
\DeclareGraphicsExtensions{.png}
\begin{document}
\title{Highly imaginative title}
\author{romunov}
\maketitle
<<fig = TRUE, png = TRUE, echo = FALSE>>=
plot(1:10, 1:10)
@
\end{document}