Р: Можно ли извлечь исходные данные из объекта gtable, созданного с помощью grid.arrange и ggplot?

Описание проблемы

Я создал объект gtable (также gTree grob gDesc) myobj через myobj <- gridExtra::grid.arrange(g1,g2) из двух объектов ggplot g1,g2 некоторое время назад, и теперь мне нужно восстановить данные, которые я использовал для создания обоих ggplots. Есть ли способ сделать это правильно?

Что я пробовал до сих пор

Я уже пытался преобразовать myobj с помощью различных функций, например, ggpubr::as_ggplot, в результате чего получился объект с записью waiver() как $data — так что безуспешно — и я также просмотрел все записи grobs в myobj, где я фактически нашел точки данных по сюжету (выглядит так

grobs.grobs.children.geom_point.points.5415.x1 
                                    0.04545455 

), которые, однако, являются только координатами положения $\in (0,1)$ относительно. соответствующую ось. Тогда я, вероятно, смогу получить ось + диапазон осей, а затем экстраполировать исходные точки данных. Но это кажется чрезмерно трудоемким. Есть ли более простое решение для этого?

Репрекс (вроде)

Не уверен, что это на самом деле приводит к тому же объекту, что и у меня (потому что моему почти 2 года), но для начала:

library(ggplot)

# plot 1
g1 <- ggplot(mpg, aes(displ, cty)) + geom_point() + facet_grid(cols = vars(cyl))

# plot 2
g2 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point() + facet_grid(vars(cyl))

# create object
myobj <- gridExtra::grid.arrange(g1, g2, ncol=1)

# Now I would need some extract_data function to retrieve mpg and mtcars:
list_with_mpg_and_mtcars <- extract_data(myobj)


person R大卫    schedule 17.04.2020    source источник
comment
Кажется актуальным: Инверсия ggplotGrob?   -  person markus    schedule 17.04.2020
comment
Спасибо. Я пробовал предложенные функции / хаки, я могу добраться только до того момента, когда мой объект представляет собой правильно выглядящий объект gg или ggplot, но все же с аргументом waiver() as $data.   -  person R大卫    schedule 18.04.2020


Ответы (1)


Вы не можете; на этом этапе (а именно, после ggplotGrob) данные были обработаны в графические объекты, и отображение обычно необратимо, как омлет.

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

myobj$grobs[[2]]$grobs[[2]]$children[[3]][c('x','y')]

$x
 [1] 0.525145067698259native 0.587040618955513native
 [3] 0.525145067698259native 0.89651837524178native 
 [5] 0.819148936170213native 0.954545454545455native
 [7] 0.474854932301741native 0.699226305609285native
 [9] 0.648936170212766native 0.819148936170213native
[11] 0.470986460348163native

$y
 [1] 0.233037353850445native  0.435264173310709native 
 [3] 0.425966388507938native  0.205143999442133native 
 [5] 0.0691638967016109native 0.12030171311685native  
 [7] 0.266741823760489native  0.143546175123777native 
 [9] 0.191197322237977native  0.0454545454545455native
[11] 0.339961879082309native 
person user13357985    schedule 20.04.2020