将R绘图导出为多种格式

将R绘图导出为多种格式,r,plot,graphics,R,Plot,Graphics,既然可以将R绘图导出为PDF、PNG或SVG等格式,那么是否也可以将R绘图同时导出为多种格式?例如,在不重新计算绘图的情况下,将绘图导出为PDF、PNG和SVG?是的,绝对正确!代码如下: library(ggplot2) library(purrr) data("cars") p <- ggplot(cars, aes(speed, dist)) + geom_point() prefix <- file.path(getwd(),'test.') devices <-

既然可以将R绘图导出为PDF、PNG或SVG等格式,那么是否也可以将R绘图同时导出为多种格式?例如,在不重新计算绘图的情况下,将绘图导出为PDF、PNG和SVG?

是的,绝对正确!代码如下:

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))
库(ggplot2)
图书馆(purrr)
数据(“汽车”)

p在不使用
ggplot2
和其他软件包的情况下,这里有两种替代解决方案

  • 创建一个函数,用指定的设备生成一个绘图,并
    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)
    

  • 第二种方法可能有点棘手,因为它需要。但它也同样有效。这两种方法都适用于其他绘图系统,包括
    ggplot2
    ,只需将绘图生成代码替换为上面的
    plot(x,y)
    ,您可能需要
    显式打印ggplot对象。

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