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