在 arrangeGrob 之后拆分或删除图形
splitting or removing graphs after arrangeGrob
我用 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)
我想删除两个地块之一。
网格图形是事物的复杂嵌套树。一点点(好吧,很多)试错成功地让你的两个情节像这样:
> 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]])
可能有更简单的方法...
首先,使用 grid.ls()
查看构成情节的 grob 列表。在这里,您将查找编码各个图的两个 gTree
对象的名称。 (相对于lattice,ggplot2对组件grobs的命名相对没有帮助,虽然在这种情况下,不难看出你在哪一块会想要提取的。)
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)
如果您不必使用 arrangeGrob
:可以从 gtable
布局中提取 grob。设置布局需要更长的时间,但所需元素的提取很简单。
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)
我用 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)
我想删除两个地块之一。
网格图形是事物的复杂嵌套树。一点点(好吧,很多)试错成功地让你的两个情节像这样:
> 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]])
可能有更简单的方法...
首先,使用 grid.ls()
查看构成情节的 grob 列表。在这里,您将查找编码各个图的两个 gTree
对象的名称。 (相对于lattice,ggplot2对组件grobs的命名相对没有帮助,虽然在这种情况下,不难看出你在哪一块会想要提取的。)
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)
如果您不必使用 arrangeGrob
:可以从 gtable
布局中提取 grob。设置布局需要更长的时间,但所需元素的提取很简单。
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)