我有一个复杂的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"]]])
哪个给:
到目前为止,这很好,但是现在我想提取图例,对其进行修改(例如,通过删除因子“ 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.remove
和grid.edit
需要一个gPath
对象。但是,我找不到该路径。
使用ggplot2 Wiki中的示例,可以使用grid.ls
函数解决此问题,但是现在看来输出非常有限:
grid.ls(gg_grod)
layout
我可以使用以下方式绘制未修改的图例:
grid.draw(gg_grod$grobs[[15]]$grobs[[1]])
有什么想法如何使用从grid.remove
提取的ggplot2对象中使用grid.edit
和ggplotGrob
?
顺便说一句,运行教程中的示例现在会出现错误:
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
软件包。我的真正问题也比这个琐碎的例子还要复杂。谢谢。