Сохранить сюжет в объекте

В ggplot2можно легко сохранить графику в объекте R.

p = ggplot(...) + geom_point()      # does not display the graph
p                                   # displays the graph

Стандартная функция plot создает графику как пустую функцию и возвращает NULL.

p = plot(1:10)     # displays the graph
p                  # NULL

Можно ли сохранить графику, созданную plot в объекте?

3 ответа

Решение

Базовую графику рисуют прямо на устройстве.

Вы могли бы использовать

1- recordPlot

2- недавно введенный gridGraphics пакет, чтобы преобразовать базовую графику в ее сеточный эквивалент

Вот минимальный пример,

plot(1:10) 

p <- recordPlot()
plot.new() ## clean up device
p # redraw

## grab the scene as a grid object
library(gridGraphics)
library(grid)
grid.echo()
a <- grid.grab()

## draw it, changes optional
grid.newpage()
a <- editGrob(a, vp=viewport(width=unit(2,"in")), gp=gpar(fontsize=10))
grid.draw(a)

Я очень опоздал к этому, но это был первый вопрос, который появился, когда я искал вопрос. Поэтому я хотел бы добавить свое решение для будущих зрителей, которые сталкиваются с вопросом.

Я решил это, используя функцию вместо объекта. Например, предположим, что мы хотим сравнить два бета-распределения с разными параметрами. Мы можем запустить:

z1<-rbeta(10000,5,5)
z2<-rbeta(10000,20,20)
plotit<-function(vector,alpha,beta){
plot(density(vector),xlim=c(0,1))
abline(v=alpha/(alpha+beta),lty="longdash")
}

И сохраните графики как функции, а не объекты.

z.plot1<-function(){plotit(z1,5,5)}
z.plot2<-function(){plotit(z2,20,20)}

Затем мы можем вызывать каждый график, как мы хотим, просто вызывая два графика как функции, а не объекты.

z.plot1()

строит первый сюжет и

z.plot2()

Сюжеты вторые.

Надеюсь, что это поможет тому, кто столкнется с этим позже!

Вы можете использовать функцию активного связывания pryr пакет, если вы не хотите напрямую изменять значения созданного объекта.

library(pryr)
a %<a-% plot(1:10,1:10)

Каждый раз, когда вы печатаете a на консоли график будет перепечатан на экране. %<a-% оператор будет перезапускать скрипт каждый раз (я думаю, что для одного графика это не проблема). По сути, каждый раз, когда вы используете a код будет перезапущен в результате чего ваш график, который, конечно, вы можете манипулировать (наложить другой график сверху) или сохранить с помощью png например. Само значение не будет сохранено в a тем не мение. Значение по-прежнему будет NULL.

Я не знаю, что вы ищете, но это может быть приемлемым решением.

library(ggplot2)
# if mygraph is a plot object
ggsave("myplot1.png",mygraph)

# if the plot is in a list (e.g. created by the Bibliometrics package)
ggsave("myplot1.png",mygraphs[[1]])
Другие вопросы по тегам