在PDF中绘制为位图

时间:2011-11-08 10:27:30

标签: r pdf graphics 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()

4 个答案:

答案 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.pngtest2.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}