【问题标题】:How can I plot to multiple devices at the same time?如何同时绘制到多个设备?
【发布时间】:2015-05-07 13:24:10
【问题描述】:

当我在绘图时,我经常像这样绘制到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()

问题是绘图代码重复了两次。是否可以指定多个设备进行绘图?

【问题讨论】:

  • p <- qplot(1,1) ; l_ply(c("png", "pdf"), function(ext, ...) ggsave(paste("_ggplot.", ext, sep=""), p, ...)) 可以避免重复代码。

标签: r plot ggplot2


【解决方案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("device")) 指定的新设备。"

    【讨论】:

      【解决方案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】:

          使用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为逗号,默认输出目录为figures/。

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-07-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-12-26
              • 2018-01-04
              相关资源
              最近更新 更多