当我正在策划时,我经常会使用这样的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()
问题是绘图代码重复两次。是否可以指定多个设备进行绘图?
答案 0 :(得分:20)
您可以使用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"))
答案 1 :(得分:7)
不,这是不可能的。至少不是根据?grDevices
的手册:
“详细信息:只有一个设备是'有效'设备:这是设备中的设备 所有图形操作都会发生。有一个“空设备” 总是打开但实际上是一个占位符:任何使用它的尝试都会 打开由getOption(“device”)指定的新设备。“
答案 2 :(得分:3)
泰勒的标准用法是正确的。但是,为了使生活更轻松,您可以尝试另一种方法:将绘图代码作为函数包装,以便您可以包装一系列输出。这至少可以简化您生成输出的代码。
另一种可行的方法是通过foreach
分叉你的进程,每次迭代产生一种不同类型的输出,具体取决于与迭代相关的索引。我已经这样做了并行生成了很多图(虽然我可能使用了Hadoop,但我现在还记不清了。)
答案 3 :(得分:3)
你可以使用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()
}
答案 4 :(得分:1)
使用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)
})
这将生成&#39; myfig_ggplot.eps&#39;和&#39; myfig_ggplot.png&#39;。默认的sep
是逗号,默认的输出目录是数字/.
答案 5 :(得分:0)
ggplot(....)+(...) ggsave( “file1.png”) ggsave( “file1.pdf”) ggsave( “file1.jpg”)
ggplot(....)+(...) ggsave( “file2.png”) ggsave( “file2.pdf”) ggsave( “file2.jpg”)