Как получить объекты ggplot обратно из объектаrangeGrob? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть функция, которая возвращает arrangeGrob.Я хотел бы получить доступ к отдельным объектам ggplot, чтобы сделать их входными данными, чтобы сказать ggplotly.Я попытался посмотреть на структуру объектаrangeGrob, но, похоже, нет способа получить это.Мне не нужно строить сюжет, мне нужно использовать его в другом месте.В приведенном ниже примере я хотел бы иметь возможность вернуть каждый из (ggplot) p1 в списке, указанном дляrangeGrob.

library(ggplot2)
library(gridExtra)
p1 = ggplot(data = pressure, aes(x = temperature, y = pressure)) + geom_line() + theme_light()

p = arrangeGrob(grobs = list(p1, p1), ncol=2, widths=c(1,1))
str(p)
grid.draw(p)
grid.draw(p$grobs[[1]])
grid.draw(p$grobs[[2]])

str(p1)
str(p$grobs[[2]])
plot(p$grobs[[2]])

library(plotly)
ggplotly(p$grobs[[2]])

1 Ответ

0 голосов
/ 14 октября 2018

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

library(ggplot2)
library(gridExtra)
library(grid)

p1 = ggplot()

pl <- lapply(list(p1, p1), function(p) {class(p) <- c('dummy','grob'); p})

drawDetails.dummy <- function(x, recording = FALSE) {
  class(x) <- c('ggplot')
  grid.draw(ggplotGrob(x))
}

g = arrangeGrob(grobs = pl, widths=c(1,2))
grid.newpage()
grid.draw(g)

pp1 <- g$grobs[[1]]
class(pp1) <- class(p1)
identical(p1,pp1)
...