R:是否可以从使用 grid.arrange 和 ggplot 创建的 gtable 对象中提取原始数据?
R: Is it possible to extract the original data from a gtable object created with grid.arrange and ggplot?
问题描述
我通过 myobj <- gridExtra::grid.arrange(g1,g2)
从两个 ggplot
objects g1
,g2
前段时间,现在我必须恢复我用来创建两个 ggplots 的数据。有没有办法正确地做到这一点?
到目前为止我尝试了什么
我已经尝试使用各种函数转换 myobj
,例如 ggpubr::as_ggplot
,结果是一个对象 waiver()
作为 $data
条目 - 所以没有成功那里 - 我还扫过 myobj
中的所有 grobs
条目,实际上我在图中找到了数据点(看起来像这样
grobs.grobs.children.geom_point.points.5415.x1
0.04545455
),然而,它们只是位置坐标 $\in (0,1)$ w.r.t。相应的轴。然后我大概可以得到坐标轴+坐标轴范围然后外推原始数据点。但这似乎太费力了。有更简单的解决方案吗?
Reprex(有点)
不确定这是否真的会产生与我相同的对象(因为我的对象已经快 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)
你不能;在此阶段(即 ggplotGrob
之后),数据已被处理成图形对象,映射通常不可逆,就像煎蛋一样。
如果您绝望 想要取回一些值,您可以检查与标绘点对应的单个 grob,例如
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
问题描述
我通过 myobj <- gridExtra::grid.arrange(g1,g2)
从两个 ggplot
objects g1
,g2
前段时间,现在我必须恢复我用来创建两个 ggplots 的数据。有没有办法正确地做到这一点?
到目前为止我尝试了什么
我已经尝试使用各种函数转换 myobj
,例如 ggpubr::as_ggplot
,结果是一个对象 waiver()
作为 $data
条目 - 所以没有成功那里 - 我还扫过 myobj
中的所有 grobs
条目,实际上我在图中找到了数据点(看起来像这样
grobs.grobs.children.geom_point.points.5415.x1
0.04545455
),然而,它们只是位置坐标 $\in (0,1)$ w.r.t。相应的轴。然后我大概可以得到坐标轴+坐标轴范围然后外推原始数据点。但这似乎太费力了。有更简单的解决方案吗?
Reprex(有点)
不确定这是否真的会产生与我相同的对象(因为我的对象已经快 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)
你不能;在此阶段(即 ggplotGrob
之后),数据已被处理成图形对象,映射通常不可逆,就像煎蛋一样。
如果您绝望 想要取回一些值,您可以检查与标绘点对应的单个 grob,例如
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