@baptiste的答案帮助我更好地理解了gtable结构以及如何修改它。下面是我修改后的代码片段,仅供(我自己)重用。
它使用find_panel()
来获取面板范围,并将修改直接通过%>%
管道传递到grid.draw
中。这种管道方式大大简化了对gtable_*
函数的操作,因为它允许轻松取消注释单行并检查对最终图的影响。
library(ggplot2)
library(grid)
library(gtable)
library(dplyr)
p <- ggplot(tribble(~x,~y,~a,~b,
1, 1, "a1","b1",
1, 1, "a2","b1",
1, 1, "a2","b2"),
aes(x=x,y=y)) +
geom_point() +
facet_grid(vars(a),vars(b))
g <- ggplotGrob(p)
panels_extent <- g %>% find_panel()
g %>%
gtable_add_cols(widths = unit(1,"cm"), pos = -1) %>%
gtable_add_grob(rectGrob(gp=gpar(fill="red")),
t = panels_extent$t, b = panels_extent$b,
l = -1, r = -1) %>%
gtable_add_rows(heights = unit(1,"cm"), pos = 0) %>%
gtable_add_grob(rectGrob(gp=gpar(fill="green")),
t = 1, b = 1,
l = panels_extent$l, r = panels_extent$l+1) %>%
{grid.newpage();grid.draw(.)}
![enter image description here](https://istack.dev59.com/k8u5l.webp)
gtable
,然后你就可以在由 ggplot 返回的不太基础的 gtable 中添加新的 grobs、新的 viewports 等等。 - baptiste