В 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
в объекте?
plot
является универсальным, и,plot
насколько мне известно , разные методы возвращают такие объекты.plot.default
Однако действительно возвращаетсяNULL
.p
после сохранения его как объекта? Или вы хотите сохранить его как объект, для которого вы сможете, например, изменить его значения?Ответы:
базовая графика рисуется прямо на устройстве.
Вы могли бы использовать
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)
источник
saveRDS(object = p, file = "p.Rds")
загрузить новый сеанс R, запустите,p <- readRDS(file = "p.Rds")
а затемp
я получаю сообщение об ошибкеError in replayPlot(x) : loading snapshot from a different session
. Яp
неправильно сохраняю объект?gridGraphics
метод, показанный здесь, цвета на перерисованном графике продолжалиgrid.grab(wrap=TRUE)
Я очень опоздал с этим, но это был первый вопрос, который возник, когда я искал его. Поэтому я хотел бы добавить свое решение для будущих зрителей, которые столкнутся с этим вопросом.
Я решил это, используя функцию вместо объекта. Например, предположим, что мы хотим сравнить два бета-распределения с разными параметрами. Мы можем запустить:
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)}
Затем мы можем вызывать каждый график по своему усмотрению, просто вызывая два графика как функции, а не как объекты.
строит первый сюжет и
сюжеты второй.
Надеюсь, это поможет тому, кто столкнется с этим позже!
источник
recordPlot
определенно полезен (если у вас уже открыто окно), но это именно то, что люди ищут, когда посещают этот пост. +1!Вы можете использовать функцию активной привязки
pryr
пакета, если не хотите напрямую изменять значения созданного объекта.library(pryr) a %<a-% plot(1:10,1:10)
Каждый раз, когда вы вводите
a
текст на консоли, график будет воспроизводиться на экране.%<a-%
Оператор перезапуске скрипта каждый раз (в случае одного графа это не проблема , я думаю). Таким образом, практически каждый раз, когда вы используетеa
код, он будет запускаться повторно, что приведет к вашему графику, которым вы, конечно же, можете манипулировать (наложить другой график сверху) или сохранить,png
например. Однако само значение не будет сохранено вa
. Значение по-прежнему будет NULL.Я не знаю, является ли вышеперечисленное то, что вы ищете, но это может быть приемлемым решением.
источник
plot(1:10);abline(v=4)
например)? +1a %<a-% {plot(1:10);abline(v=4)}
. Если вы введете его в фигурных скобках, у вас может быть столько строк, сколько захотите! Кроме того, если вы хотите переназначить значение,a
вам нужно сначала удалить его,rm(a)
а затем переназначить с помощью%<a-%
оператор в противном случае вы получите предупреждение , я не знаю , почему это происходит , но я предполагаю , что это не имеет большого значения ..%<a-%
. Спасибо%<d-%
, это может пригодиться позже. Рад, что смог помочь :)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]])
источник