2014-12-10 6 views
1

Много времени я нахожу очень полезным для вывода графики с помощью pdf(), поскольку он позволяет мне прокручивать страницы и наблюдать тонкие различия (например, номера страниц могут соответствовать конкретному параметру в моделирование).R: Растровый вывод в PDF

Иногда, если участок довольно заполнен информацией, тот факт, что PDF является векторной графикой, означает, что для чтения в PDF-ридере требуется много времени и бесполезно прокручивать страницы. Я мог бы рисовать с png(), но это привело бы к многим файлам изображений.

Моим идеальным решением было бы иметь устройство, которое будет отображать растровое изображение (например, PNG) в PDF.

Я читал, что cairo_pdf() выходы к растровому изображению иногда? Или я мог бы написать что-то, что выводит в PNG, а затем объединяет все это в PDF?

Другие мысли? Или у кого-то есть решение для этого?

+0

Проверить 'dev.copy' семейство функций, в частности,' dev.copy2pdf() ': http://stat.ethz.ch/R-manual/R-patched/library/grDevices/html /dev2.html. Кроме того, рассмотрите запрос модераторов на перенос этого вопроса в StackOverflow, так как это действительно вопрос R, а не статистический. –

+1

Помогает ли одно из решений на следующей странице? http://stackoverflow.com/q/8048984, в частности, решение, использующее 'readPNG' из пакета' png', помогло мне однажды. – BenBarnes

+0

Спасибо @Ben, я постараюсь в какой-то момент – sqrt

ответ

1

ОБНОВЛЕНИЕ: теперь добавлен метод, основанный на readPNG(), как предложено в комментариях выше. Это немного медленнее (3s против 9s) и, кажется, приводит к чуть большему размеру файлов, чем ImageMagick. rasterImage() Интерполяция не влияет на размер файла или время, но слегка изменяет внешний вид. Если это FALSE, то это выглядит так же, как ImageMagick

Я только что придумал следующее решение, используя ImageMagick. Это не идеально, но, похоже, пока все хорошо.

png2pdf <- function(name=NULL,removepngs=TRUE,method="imagemagick",pnginterpolate=FALSE){ 
    # Run the png() function with a filename of the form name%03d.png 
    # Then the actual plotting functions, e.g. plot(), lines() etc. 
    # Then dev.off() 
    # Then run png2pdf() and specify the name= argument if other pngs exist in the directory 

    # Need to incorporate a way of dealing with non-square plots 

    if(is.null(name)){ 
     names <- list.files(pattern="[.]png") 
     name <- unique(sub("[0-9][0-9][0-9][.]png","",names)) 
     if(length(name)!=1) stop("png2pdf() error: Check filenames") 
    }else{ 
     names <- list.files(pattern=paste0(name,"[0-9][0-9][0-9][.]png")) 
    } 

    # Can change this to "convert" if it is correctly in the system path 
    if(method=="imagemagick"){ 
    cmd <- c('C:\\Program Files\\ImageMagick-6.9.0-Q16\\convert.exe',names,paste0(name,".pdf")) 
    system2(cmd[1],cmd[-1]) 
    }else if(method=="readPNG"){ 
    library(png) 
    pdf(paste0(name,".pdf")) 
    par(mar=rep(0,4)) 
    for(i in 1:length(names)){ 
     plot(c(0,1),c(0,1),type="n") 
     rasterImage(readPNG(names[i]),0,0,1,1,interpolate=pnginterpolate) 
    } 
    dev.off() 
    } 
    if(removepngs) file.remove(names) 
} 
+1

. Продвижение этого, несмотря на чистое решение R, было бы более элегантным. –

+1

Согласитесь, что чистое R-решение будет лучше. Просто натолкнулись на альтернативный способ сделать это, используя ghostscript и imagemagick: [pdfconvert] (http://www.rdocumentation.org/packages/lava/functions/pdfconvert) [(источник)] (https: // github .com/cran/lava/blob/master/R/zpdfconvert.R) – sqrt

+0

Интересно. Но я все же предпочел бы чистое решение R. Когда/если у вас будет возможность взглянуть на 'dev.copy2pdf()', который я предложил, пожалуйста, поделитесь своим мнением относительно этого подхода. –

Смежные вопросы