Сюжет в виде растрового изображения в PDF - PullRequest
5 голосов
/ 08 ноября 2011

В настоящее время я работаю над результатами массива CGH, которые включают в себя несколько графиков из десятков тысяч точек, и я хотел бы воспользоваться преимуществами многостраничной функции устройства PDF и легкостью формата изображения PNG.

Проблема в том, что устройство PDF хранит графики в виде векторных рисунков, поэтому файлы PDF огромны и для их открытия требуется несколько минут.Интересно, может ли R отобразить несколько растровых изображений, встроенных в один файл PDF, так как я знаю, что формат PDF способен справиться с этим.

Вот простой пример, файл PDF составляет около 2 Мо, тогда как файлы pngоколо 10 Ко, поэтому я хотел бы, чтобы PDF-файл около 20 Ко.

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 ]

4 голосов
/ 08 ноября 2011

Используйте драйвер png для создания PNG-файла приемлемого разрешения.Сделай свой сюжет к этому.Закройте устройство png.

Затем используйте readPNG из пакета: png для его чтения.

Затем откройте драйвер PDF, создайте пустой график без полей и границ в (0,0)(1,1) и нарисуйте PNG для этого с помощью rasterImage.Добавьте дополнительные страницы, создавая новые сюжеты.Закрыть PDF драйвер.

Это должно дать вам PDF с растровыми версиями графиков.Есть несколько хитрых моментов в правильной настройке графиков, и разрешение png имеет решающее значение, но я думаю, что все вышеперечисленное имеет все ингредиенты.

3 голосов
/ 08 ноября 2011

Вот решение, которое приближает вас (50 КБ) к желаемому размеру файла (25 КБ), не требуя установки LaTeX и / или изучения Sweave. (Не то, чтобы что-то из этого нежелательно в долгосрочной перспективе!)

Используются функции grid grid.cap() и grid.raster(). Больше деталей и идей в недавней статье 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()

Получающиеся pdf изображения, кажется, сохраняют больше деталей, чем ваши файлы test1.png и test2.png, поэтому вы можете стать еще ближе к своей цели, обрезав их разрешение.

1 голос
/ 08 ноября 2011

Чтобы включить несколько графиков в ваш 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()

Затем создайте документ LaTeX, который включает эти PNG. Вы можете сделать это из R с помощью Sweave (но как это сделать достаточно большой, чтобы быть его собственным вопросом). Приличный вводный пример здесь .

0 голосов
/ 08 ноября 2011

Как насчет растворов?

\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}
...