如何在调用plot_grid后提取子图中的ggplot对象?
从cowplot的plot_grid输出中提取单个ggplot对象的通用方法
当然有通用方法啦!cowplot的plot_grid()其实悄悄把你传入的原始ggplot对象都存起来了,你直接就能提取出来,根本不用写复杂的提取函数~
当你用plot_grid()组合绘图后,返回的复合对象里自带一个plots列表,里面就保存着所有传入的原始绘图对象(不管是ggplot还是其他plot_grid生成的复合图)。你直接访问这个列表就能拿到单个ggplot对象,之后想怎么修改都可以。
完整示例代码
library(ggplot2) library(cowplot) # 生成测试数据与初始绘图 d = data.frame(x=rnorm(100), y=rnorm(100), g=sample(c('a', 'b'), 100, replace=T)) p1 = ggplot(d) + geom_point(aes(x=x, y=y, colour=g)) p2 = ggplot(d) + geom_point(aes(x=y, y=x, colour=g)) # 用plot_grid组合绘图 p = plot_grid(p1, p2, nrow=1) # 提取原始ggplot对象(替代你设想的extract_ggplot_objects函数) q = p$plots q1 = q[[1]] q2 = q[[2]] # 对提取出的绘图进行修改 q1 = q1 + theme(legend.position='none') q2 = q2 + ylab('') + theme(axis.text.y=element_blank(), axis.ticks.y=element_blank()) # 重新组合修改后的绘图 new_p = plot_grid(q1, q2, nrow=1) # 查看最终结果 new_p
嵌套场景的处理
如果你的复合图是多层嵌套的(比如plot_grid里又包含另一个plot_grid生成的图),也不用担心——只需要递归访问每个子对象的$plots属性,就能提取到最底层的单个ggplot对象,这个方法完全通用。
内容的提问来源于stack exchange,提问作者adn bps
相关产品推荐
相关产品推荐

