R графика: вывод в несколько форматов файлов - PullRequest
5 голосов
/ 06 января 2020

В ряде сценариев я сначала разрабатываю график на экране, а затем необходимо сохранить его в виде нескольких форматов файлов с определенной высотой / шириной / разрешением. Используя png(), pdf(), svg(), ..., чтобы открыть устройство, а затем dev.off(), чтобы закрыть его, я вынужден поместить все вызовы открытия устройства в мой скрипт и закомментировать их. -запустите код по одному устройству за раз.

Я знаю, что для графики ggplot, ggsave() делает это проще. Есть ли что-нибудь, что я могу сделать, чтобы упростить это для base-R и решетка графика?

Один пример:

png(filename="myplot.png", width=6, height=5, res=300, units="in")
# svg(filename="myplot.svg", width=6, height=5)
# pdf(filename="myplot.pdf", width=6, height=5)

op <- par()  # set graphics parameters
plot()       # do the plot
par(op)
dev.off() 

Ответы [ 2 ]

1 голос
/ 06 января 2020

Вы можете использовать пакет cowplot для преобразования вашей базовой или решетчатой ​​графики в объекты ggplot2, которые затем можно сохранить с помощью ggsave(). Это не совсем надежно, но подойдет для большинства участков. Вам также нужно установить пакет gridGraphics, чтобы это работало. Подробнее здесь.

library(ggplot2)
library(cowplot)
#> 
#> ********************************************************
#> Note: As of version 1.0.0, cowplot does not change the
#>   default ggplot2 theme anymore. To recover the previous
#>   behavior, execute:
#>   theme_set(theme_cowplot())
#> ********************************************************

# define a function that emits the desired plot
p1 <- function() {
  par(
    mar = c(3, 3, 1, 1),
    mgp = c(2, 1, 0)
  )
  boxplot(mpg ~ cyl, xlab = "cyl", ylab = "mpg", data = mtcars)
}

# the plot using base graphics
p1()


# the plot converted into a ggplot2 object
p2 <- ggdraw(p1)
p2


# save in different formats
ggsave("plot.pdf", p2)
#> Saving 7 x 5 in image
ggsave("plot.png", p2)
#> Saving 7 x 5 in image
ggsave("plot.svg", p2)
#> Saving 7 x 5 in image

Создано в 2020- 01-05 представительный пакет (v0.3.0)

1 голос
/ 06 января 2020

Графические устройства являются частью пакета grDevices. документация по работе с несколькими открытыми устройствами, возможно, стоит прочитать. Из того, что я понимаю, хранится круговой массив открытых устройств, но активным является только текущее устройство. По этой причине, открытие всех нужных устройств и последующее их обведение с помощью dev.list(), вероятно, является лучшим выбором.

# data for sample plot
x <- 1:5
y <- 5:1

# open devices
svg(filename="myplot.svg", width=6, height=5)
png(filename="myplot.png", width=6, height=5, res=300, units="in")
pdf()

# devices assigned an index that can be used to call them
dev.list()
svg png pdf 
  2   3   4 

# loop through devices, not sure how to do this without calling plot() each time
# only dev.cur turned off and dev.next becomes dev.cur
for(d in dev.list()){plot(x,y); dev.off()} 

# check that graphics device has returned to default null device
dev.cur()
null device 
      1 
dev.list()
NULL

file.exists("myplot.svg")
[1] TRUE
file.exists("myplot.png")
[1] TRUE
file.exists("Rplots.pdf") # default name since none specified in creating pdf device
[1] TRUE

В документации есть еще кое-что, с чем вы можете работать.

...