我使用ggplot
创建了一个图表,之后我使用arrangeGrob
来组合这些图表。有没有办法从这个组合图中删除图形的部分?或者可能提取?
这是一个最小的例子:
library(ggplot2)
library(gridExtra)
df <- data.frame(x=rnorm(20), y=rnorm(20), y2=rnorm(20))
g1 <- ggplot(df, aes(x, y)) + geom_point()
g2 <- ggplot(df, aes(x, y2)) + geom_point()
g <- arrangeGrob(g1,g2, widths=c(3.5,7.5), ncol=2)
print(g)
我想删除两个图中的一个。
答案 0 :(得分:4)
首先,使用grid.ls()
查看构成情节的凹凸列表。在这里,您将查找编码各个图的两个gTree
对象的名称。 (与 lattice 相比, ggplot2 对组件grob的命名相对无益,尽管在这种情况下,看起来你想要提取哪些部分并不难。 )
grid.ls()
# GRID.arrange.90
# GRID.frame.84
# GRID.cellGrob.85
# GRID.frame.5
# GRID.cellGrob.44
# GRID.gTree.42
# GRID.clip.43
# layout
# GRID.cellGrob.83
# GRID.gTree.81
# GRID.clip.82
# layout
# GRID.cellGrob.86
# GRID.null.1
# GRID.cellGrob.87
# GRID.null.2
# GRID.cellGrob.88
# GRID.null.4
# GRID.cellGrob.89
# GRID.null.3
然后,您可以像这样提取和绘制它们:
gg1 <- getGrob(g, ("GRID.gTree.42"))
grid.draw(gg1)
gg2 <- getGrob(g, ("GRID.gTree.81"))
grid.draw(gg2)
答案 1 :(得分:1)
网格图形是复杂的嵌套树状结构。有点(好吧,很多)试验和错误设法让你的两个情节像这样:
> plot(g$children[[1]]$children[[1]]$children[[1]]$children[[1]]$children[[1]]$children[[2]])
> plot(g$children[[1]]$children[[1]]$children[[1]]$children[[2]]$children[[1]]$children[[2]])
可能更容易......
答案 2 :(得分:0)
如果您不必使用arrangeGrob
:可以从gtable
布局中提取凹凸。设置布局需要更长的时间,但提取所需元素非常简单。
library(gtable)
library(grid)
gt = gtable(unit(c(3.5, 7.5), "null"), unit(1, "null"))
gt = gtable_add_grob(gt, ggplotGrob(g1), l = 1, t = 1)
gt = gtable_add_grob(gt, ggplotGrob(g2), l = 2, t = 1)
plot(gt)
plot(gt[, 1])
plot(gt[, 2])
如果你想保持提取的图的大小和位置与其大小和位置在组合图中相同:
编辑:使用Baptiste的建议:
gt = gtable(unit(c(3.5, 7.5), "null"), unit(1, "null"))
gt = gtable_add_grob(gt, ggplotGrob(g1), name = "g1", l = 1, t = 1)
gt = gtable_add_grob(gt, ggplotGrob(g2), name = "g2", l = 2, t = 1)
grid.newpage()
grid.draw(gtable_filter(gt, "g2", trim = FALSE))
grid.newpage()
grid.draw(gtable_filter(gt, "g1", trim = FALSE))
<强>原始强>
# Keep g2
p2 = gt
p2$layout = gt$layout[-1, ]
p2$grobs = gt$grobs[-1]
grid.newpage()
grid.draw(p2)
# Keep g1
p1 = gt
p1$layout = gt$layout[-2, ]
p1$grobs = gt$grobs[-2]
grid.newpage()
grid.draw(p1)