Сохранение графика в формате PDF и одновременное отображение его в окне (x11) - PullRequest
17 голосов
/ 09 ноября 2011

Я написал функцию, которая создает барплот.Я хотел бы сохранить этот график в формате PDF, а также отобразить его на моем экране (x11) при применении этой функции.Код выглядит следующим образом.

create.barplots <- function(vec)
 {
   x11()                                  # opens the window
   ### Here is a code that creates a barplot and works perfectly
   ### but irrelevant for my question
   dev.copy(pdf("barplots.table.2.pdf")) # is supposed to copy the plot in pdf
                                         # under the name "barplots.table.2.pdf"
   dev.off()                             # is supposed to close the pdf device
 }

Это создает следующую ошибку: «устройство» должно быть функцией

Когда я изменяю код на:

create.barplots <- function(vec)
 {
   x11()
   ### Here is a code that creates a barplot and works perfectly
   ### but irrelevant for my question
   dev.copy(pdf) # This is the only difference to the code above
   dev.off()
 }

R отображает график и создает файл с именем Rplots.pdf.Это проблема по нескольким причинам.

Я также пытался открыть устройства наоборот.Сначала откройте устройство pdf, затем скопируйте содержимое устройства pdf на устройство x11, затем установите устройство pdf как активное и затем закройте устройство pdf.Код здесь выглядит следующим образом:

create.barplots <- function(vec)
 {
   pdf("barplots.table.2.pdf") # open the pdf device
   ### Here is a code that creates a barplot and works perfectly
   ### but irrelevant for my question
   dev.copy(x11)              # copy the content of the pdf device into the x11 device
   dev.set(which = 2)         # set the pdf device as actice
   dev.off()                  # close the pdf device
 }

Проблема здесь в том, что окно, которое должно отображать сюжет, пусто!

Подводя итог, у меня есть два вопроса: 1)Как сохранить график в формате PDF и одновременно отобразить его в формате x11?И 2) Как сохранить график не в рабочем каталоге где-то еще?

РЕДАКТИРОВАТЬ

Решения выше работают отлично.Но я до сих пор не понимаю, почему

pdf("barplots.table.2")
barplot(something)
dev.copy(x11)

отображает пустое серое окно вместо копирования содержимого устройства pdf в оконное устройство!Я также попробовал

pdf("barplots.table.2")
barplot(something)
dev.copy(window)

, в котором я тоже потерпел неудачу ...

Ответы [ 5 ]

25 голосов
/ 09 ноября 2011

Как насчет:

create.barplots <- function(...) {
  x11()
  plot.barplots(...) # create the barplot
  dev.copy2pdf(file = "path/to/barplots.table.2.pdf")
}
9 голосов
/ 09 ноября 2011

Вы можете легко добавить аргументы для pdf в вызове dev.copy, например:

create.barplots <- function(vec,dir,file)
 {
   windows()
   plot(vec)
   dev.copy(pdf,file=paste(dir,file,sep="/") 
   dev.off()
 }

dev.copy() имеет аргумент ... для передачи аргументов в функцию pdf, см. Также ?dev.copy. В качестве альтернативы вы можете использовать dev.copy2pdf, как сказал Макс. Я бы также посоветовал вам использовать windows() вместо x11(), иначе у вас могут возникнуть проблемы с семействами шрифтов. Значения по умолчанию для x11 и pdf не всегда совпадают.

Чтобы сохранить файл в другом каталоге, просто добавьте полный каталог (например, с помощью вставки, как в функции выше)

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

Как я уже упоминал в предыдущем посте , вы можете рассмотреть мой пакет knitr;если вы используете его в интерактивном сеансе R, вы сможете увидеть графики в окне и сохранить их в pdf без каких-либо взломов (это поведение по умолчанию).Мне все еще нужно много усилий для документации и демонстраций, но она должна быть в состоянии работать с документом Rnw.Основная причина, по которой вы можете как просматривать графики, так и сохранять их в knitr, заключается в том, что knitr очень отличается от конструкции Sweave - графическое устройство открывается после , когда код оценивается, поэтомусюжеты не будут скрыты за пределами экрана устройства.Опять же, я должен предупредить вас, что в настоящий момент это очень экспериментально.

0 голосов
/ 24 мая 2017

Основываясь на ответе Макса Гаснера, я написал эту вспомогательную функцию, которая позволяет быстро переключаться с показа и нет. Аргумент x является объектом графика или функцией, выполняющей рисование.

savepdf<-function(x, file, display=TRUE) {
    if (display){
        x;
        dev.copy2pdf(file=file)
    }
    else {
        pdf(file=file)
        x;
        dev.off()
    }
}

Пример:

savepdf(plot(c(1,2,3)), file="123.pdf", display=F)
0 голосов
/ 28 января 2015

Следующее работает хорошо для меня, когда вызывается изнутри функций.Назовите его после кода участка:

pdf2 <- function (file = "plot.pdf", w = 10, h = 7.07, openPDF = FALSE) 
{
    dev.copy2pdf(file = file, width = w, height = h, out.type = "pdf")
    if(openPDF) browseURL(file)
}

Примечание.openPDF может работать только в Windows с полным (не относительным) путем к файлу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...