如何同时绘制多个设备?

时间:2011-10-30 00:38:10

标签: r plot ggplot2

当我正在策划时,我经常会使用这样的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 个答案:

答案 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”)