【问题标题】:Export R plot to multiple formats将 R 图导出为多种格式
【发布时间】:2018-01-06 21:38:35
【问题描述】:

既然可以将 R 图导出为 PDF PNG SVG等,是否也可以将 R 图导出为多种格式 at一次?例如,将绘图导出为 PDF PNG SVG而不重新计算绘图?

【问题讨论】:

  • 不带基本图形,带包ggplot2是的。
  • 我会说即使是 ggplot2。 ggplot2 和其他网格解决方案创建了一个绘图程序,然后将其传递给打印引擎,然后再发送到设备。每次print-ed 时都需要“重新计算”。
  • 打扰一下,你觉得有人的回答有用吗?
  • @ytu IINM 当前的答案似乎重新计算了每个输出设备的情节?如果是这种情况,那么用户 42 给出了正确答案,但在评论中。
  • 我想说不是。如果您使用dev.copy,根据其文档,它“将当前设备的图形内容复制到指定的设备”,即绘图不是重新计算,而是复制。另一方面,sapply 是一个在 C 级别进行迭代的函数(您可以找到相关讨论 here)。您可以将其称为“重新计算”,但对于同一作业,它通常比 for 循环快得多。

标签: r plot graphics


【解决方案1】:

不使用ggplot2和其他包,这里有两种替代方案。

  1. 创建一个函数,使用指定设备和sapply它生成绘图

    # Create pseudo-data
    x <- 1:10
    y <- x + rnorm(10)
    
    # Create the function plotting with specified device
    plot_in_dev <- function(device) {
      do.call(
        device,
        args = list(paste("plot", device, sep = "."))  # You may change your filename
      )
      plot(x, y)  # Your plotting code here
      dev.off()
    }
    
    wanted_devices <- c("png", "pdf", "svg")
    sapply(wanted_devices, plot_in_dev)
    
  2. 使用内置函数dev.copy

    # With the same pseudo-data
    # Plot on the screen first
    plot(x, y)
    
    # Loop over all devices and copy the plot there
    for (device in wanted_devices) {
      dev.copy(
        eval(parse(text = device)),
        paste("plot", device, sep = ".")  # You may change your filename
      )
      dev.off()
    }
    

第二种方法可能有点棘手,因为它需要non-standard evaluation。然而它也有效。这两种方法都适用于其他绘图系统,包括ggplot2,只需将绘图生成代码替换为上面的plot(x, y) - 您可能需要明确地print ggplot 对象。

【讨论】:

    【解决方案2】:

    是的,绝对!代码如下:

    library(ggplot2)
    library(purrr)
    data("cars")
    p <- ggplot(cars, aes(speed, dist)) + geom_point()
    
    prefix <- file.path(getwd(),'test.')
    
    devices <- c('eps', 'ps', 'pdf', 'jpeg', 'tiff', 'png', 'bmp', 'svg', 'wmf')
    
    walk(devices,
         ~ ggsave(filename = file.path(paste(prefix, .x)), device = .x))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2020-07-04
      • 2016-05-07
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多