在使用ggplotGrob保存的grob上使用grid.edit和grid.remove

时间:2019-06-25 19:10:41

标签: r ggplot2 r-grid

我有一个复杂的ggplot2绘图,它是用一个自制函数(不是我提供的)制作的,我想在自己的绘图函数中重复使用。我想使用grid包重新组织一切。我在旧的(不推荐使用的)ggplot wiki上找到了这个不错的教程,但似乎可复制的示例已损坏,并且在新的Wiki页面上找不到等效的页面。

这是我自己的可复制示例:

我首先创建一个我存储的ggplot对象(我不想打印它):

library(grid)
library(ggplot2)

set.seed(123)
dd <- data.frame(x = sample(1:6), y = sample(1:6), cat = c("a","b","a","c","c","b"))

gg <- ggplot(dd, aes(x=x,y=y, color=cat)) +
  geom_point()+
  geom_line()

然后,使用ggplotGrob函数可以从绘图中提取grobs

gg_grod <- ggplotGrob(gg)
gg_grod
TableGrob (12 x 11) "layout": 19 grobs
    z         cells       name                                          grob
1   0 ( 1-12, 1-11) background               rect[plot.background..rect.362]
2   5 ( 6- 6, 4- 4)     spacer                                zeroGrob[NULL]
3   7 ( 7- 7, 4- 4)     axis-l           absoluteGrob[GRID.absoluteGrob.320]
4   3 ( 8- 8, 4- 4)     spacer                                zeroGrob[NULL]
5   6 ( 6- 6, 5- 5)     axis-t                                zeroGrob[NULL]
6   1 ( 7- 7, 5- 5)      panel                      gTree[panel-1.gTree.306]
7   9 ( 8- 8, 5- 5)     axis-b           absoluteGrob[GRID.absoluteGrob.313]
8   4 ( 6- 6, 6- 6)     spacer                                zeroGrob[NULL]
9   8 ( 7- 7, 6- 6)     axis-r                                zeroGrob[NULL]
10  2 ( 8- 8, 6- 6)     spacer                                zeroGrob[NULL]
11 10 ( 5- 5, 5- 5)     xlab-t                                zeroGrob[NULL]
12 11 ( 9- 9, 5- 5)     xlab-b titleGrob[axis.title.x.bottom..titleGrob.323]
13 12 ( 7- 7, 3- 3)     ylab-l   titleGrob[axis.title.y.left..titleGrob.326]
14 13 ( 7- 7, 7- 7)     ylab-r                                zeroGrob[NULL]
15 14 ( 7- 7, 9- 9)  guide-box                             gtable[guide-box]
16 15 ( 4- 4, 5- 5)   subtitle         zeroGrob[plot.subtitle..zeroGrob.358]
17 16 ( 3- 3, 5- 5)      title            zeroGrob[plot.title..zeroGrob.357]
18 17 (10-10, 5- 5)    caption          zeroGrob[plot.caption..zeroGrob.360]
19 18 ( 2- 2, 2- 2)        tag              zeroGrob[plot.tag..zeroGrob.359]

使用grid包,我现在可以重新组织布局并从绘图中重画一些grobs

grid.newpage()
grid.rect()
layout1 <- grid.layout(nrow = 3, ncol = 3,
                       heights = unit(1, c("lines", "null", "lines")),
                       widths = unit(1, c("lines", "null", "lines")))
pushViewport(viewport(layout = layout1))

pushViewport(viewport(layout.pos.row = 2, layout.pos.col = 2))
grid.draw(gg_grod$grobs[[(1:length(gg_grod$grobs))[gg_grod$layout$name=="panel"]]])

哪个给:

enter image description here

到目前为止,这很好,但是现在我想提取图例,对其进行修改(例如,通过删除因子“ a”并更改因子“ b”的颜色),然后将其放置在绘图中的其他位置

我尝试过:

grid.remove(gg_grod$grobs[[15]]$grobs[[1]]$grobs[[4]])
grid.edit(gg_grod$grobs[[15]]$grobs[[1]]$grobs[[7]], gp=gpar(col="pink"))

这是行不通的,因为grid.removegrid.edit需要一个gPath对象。但是,我找不到该路径。

使用ggplot2 Wiki中的示例,可以使用grid.ls函数解决此问题,但是现在看来输出非常有限:

grid.ls(gg_grod)
layout

我可以使用以下方式绘制未修改的图例:

grid.draw(gg_grod$grobs[[15]]$grobs[[1]])

enter image description here

有什么想法如何使用从grid.remove提取的ggplot2对象中使用grid.editggplotGrob

顺便说一句,运行教程中的示例现在会出现错误:

grid.remove(gPath("GRID.gTree","layout","panel","grill.gTree","panel.grid.major.x.polyline"),grep=T)
Error in removeDLFromGPath(gPath, name, strict, greppath, grepname, global,  : 
  gPath (GRID.gTree::layout::panel::grill.gTree::panel.grid.major.x.polyline) not found

P.S。我认为没有必要,但我想强调一下我想使用grid包的事实。可能还有其他选项和软件包可以解决此类问题,但就我而言,我想使用和学习grid软件包。我的真正问题也比这个琐碎的例子还要复杂。谢谢。

0 个答案:

没有答案