Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

базовая графика рисуется непосредственно на устройстве.

Вы можете использовать

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)

Ответ 2

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

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

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()

отображает второй.

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

Ответ 3

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

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

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

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

Ответ 4

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]])