Сохранить сюжет в объекте
В 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
в объекте?
Ответы
Ответ 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]])