Сохранение графика в формате pdf и одновременное отображение его в окне (x11)

Я написал функцию, которая создает барплот. Я хотел бы сохранить этот сюжет как 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
 }

Проблема заключается в том, что wondow, который должен отображать график, пуст!

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

ИЗМЕНИТЬ

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

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

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

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

В том, что я тоже не смог...

Ответы

Ответ 1

Как насчет:

create.barplots <- function(...) {
  x11()
  plot.barplots(...) # create the barplot
  dev.copy2pdf(file = "path/to/barplots.table.2.pdf")
}

Ответ 2

Вы можете легко добавить аргументы для 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 не всегда совпадают.

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

Ответ 3

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

Ответ 4

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

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)
}

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

Ответ 5

Основываясь на ответе Макс Гаснера, я написал эту вспомогательную функцию, которая позволяет быстро переключаться с отображения и нет. Аргумент 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)