В r, как сохранить сюжет и повторно использовать код сюжета - PullRequest
0 голосов
/ 31 января 2020

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

Этот чанк работает ...

x<-runif(10)
y<-runif(10)

png(filename="Plot0.png")
plot(y~x)
abline(h=mean(y))
dev.off()

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

x<-runif(10)
y<-runif(10)

png(filename="Plot1.png")
plot(y~x)
dev.off()

png(filename="Plot2.png")
abline(h=mean(y))
dev.off()

Проблема в plot.new has not been called yet. Это я искал, но я не могу найти биты, которые заставляют его работать.

Ответы [ 3 ]

0 голосов
/ 01 февраля 2020

В основном вам нужно переключиться на систему сетки, чтобы включить это.

Возможно, вы захотите перейти на ggplot и сохранить объект по пути, или использовать ggsave.

Вот Решение с использованием графики, которая в основном захватывает ваш базовый R-график на сетке:

library(graphics)

x<-runif(10)
y<-runif(10)

plot(y~x)
pl <- recordPlot()

png(filename="Plot1.png")
grid::grid.newpage()
pl
dev.off()

abline(h=mean(y))
pl <- recordPlot()
png(filename="Plot2.png")
grid::grid.newpage()
pl
dev.off()

В ggplot вы можете просто сделать:

library(ggplot2)
df = data.frame(
x<-runif(10),
y<-runif(10)
)    

g = ggplot(df,aes(x=x,y=y))+geom_point()+theme_bw()
ggsave(g,file="Plot1.png")
g = g + geom_hline(yintercept=mean(y))
ggsave(g,file="Plot2.png")
0 голосов
/ 01 февраля 2020

Перейдя по ссылке, данной duckmayr в исходных комментариях к вопросу, я смог достичь желаемого результата. На протяжении всей конструкции можно просто включить, скажем, p1<-recordplot(), а затем создать png p1 в конце. Я думаю, что это довольно элегантно.

x<-runif(10)
y<-runif(10)


dev.control(displaylist="enable")
  plot(y~x)
p1 <- recordPlot()
  abline(h=mean(y))
p2 <- recordPlot()
invisible(dev.off())

png(filename="Plot1.png")
p1
dev.off()

png(filename="Plot2.png")
p2
dev.off()
0 голосов
/ 01 февраля 2020

R обрабатывает базовый c график, который plot создает новый «лист бумаги», и другие функции, такие как abline, могут рисовать поверх него. Таким образом, вы не можете использовать abline без предварительного вызова сюжета. Вы назвали dev.off, который очищает предыдущий график, и поэтому у вас нет графика для использования abline с -> plot.new has not been called yet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...