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