Как я могу отображать на нескольких устройствах одновременно?

Когда я рисую, я часто рисую файл eps и файл png следующим образом:

postscript(file=paste(dir, output, "_ggplot.eps", sep=""), onefile=FALSE, horizontal=FALSE, width=4.8, height=4.0)
# Plotting code
dev.off()

png(paste(dir, output, "_ggplot.png", sep=""), width=450, height=300)
# Plotting code
dev.off()

Проблема заключается в том, что код построения повторяется дважды. Можно ли указать несколько устройств для печати?

Ответ 1

Вы можете комбинировать их с помощью dev.copy(). Например,

  X11 ()
  plot (x,y)
  dev.copy (jpeg,filename="test.jpg");
  dev.off ();

Поиск help(dev.copy) для более подробной информации.

Usage:

     dev.copy(device, ..., which = dev.next())
     dev.print(device = postscript, ...)
     dev.copy2eps(...)
     dev.copy2pdf(..., out.type = "pdf")
     dev.control(displaylist = c("inhibit", "enable"))

Ответ 2

Нет, это невозможно. По крайней мере, не в соответствии с руководством для ?grDevices:

"Подробности: только одно устройство является" активным устройством: это устройство в которые происходят во всех графических операциях. Существует "нулевое устройство", которое всегда открыт, но на самом деле является заполнитель: любая попытка его использования будет открыть новое устройство, указанное getOption ( "устройство" )).

Ответ 3

Тайлер является правильным из стандартного использования. Однако, чтобы облегчить жизнь, вы можете попробовать альтернативный метод: оберните свой код построения в виде функции, чтобы затем вы могли обернуть последовательность выходов. Это может, по крайней мере, упростить код для создания вывода.

Еще одна возможность, которая может работать, заключается в том, чтобы разветкить ваш процесс через foreach, и каждая итерация производит другой тип вывода, в зависимости от индекса, связанного с итерацией. Я сделал это, чтобы произвести много сюжетов параллельно (хотя, возможно, я использовал Hadoop, я не могу вспомнить в данный момент).

Ответ 4

Вы можете использовать цикл for:

devices <- c("pdf", "png")

for (i in seq_along(devices)) {

    if (devices[i] == "png") {
    ppi <- 600
    png(file = "Plots/regression.png",
        width = 8.4 * ppi, height = 6.5 * ppi, res = ppi,
        family = "Latin Modern Roman")
    }

    if (devices[i] == "pdf") {
        cairo_pdf(file = "Plots/regression.pdf", width = 8.4, height = 6.5,
                  family = "Latin Modern Roman")
    }

    # Insert plotting code

    graphics.off()

}

Ответ 5

ggplot (....) + (...) ggsave ( "file1.png" ) ggsave ( "file1.pdf" ) ggsave ( "file1.jpg" )

ggplot (....) + (...) ggsave ( "file2.png" ) ggsave ( "file2.pdf" ) ggsave ( "file2.jpg" )

Ответ 6

Используя пакет R.devices, вы можете сделать:

library('R.devices')
library('ggplot2')

devEval(c("eps", "png"), name="myfig", tags="ggplot", sep="_", aspectRatio=1.2, {
  gg <- qplot(mpg, wt, data=mtcars, colour=cyl)
  print(gg)
})

Это будет генерировать 'myfig_ggplot.eps' и 'myfig_ggplot.png'. По умолчанию sep является запятой, а выходной каталог по умолчанию - цифры/.