Как я могу нанести на несколько устройств одновременно? - PullRequest
13 голосов
/ 30 октября 2011

Когда я строю график, я часто строю файл 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()

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

Ответы [ 6 ]

20 голосов
/ 30 октября 2011

Вы можете объединить их, используя 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"))
7 голосов
/ 30 октября 2011

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

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

3 голосов
/ 07 мая 2015

Вы можете использовать цикл 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()

}
3 голосов
/ 30 октября 2011

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

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

1 голос
/ 28 сентября 2014

Используя пакет 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 - запятая, а выходной каталог по умолчанию - цифры /.

0 голосов
/ 01 февраля 2012

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

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

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