patchwork合并子图时图例位置控制及多层嵌套异常技术问询
问题1:patchwork拼接面板时忽略
legend.box.spacing参数,如何兼顾面板对齐与子图图例位置设置 使用patchwork拼接两个ggplot子图时,子图中设置的legend.box.spacing参数会被忽略:
library(ggplot2) p <- ggplot(mtcars, aes(wt, mpg)) p + geom_point(aes(colour = factor(cyl))) p1 <- p + geom_point(aes(colour = cyl))+ theme(legend.box.spacing = unit(20, 'pt')) p2 <- p + geom_point(aes(colour = cyl*100))+ theme(legend.box.spacing = unit(20, 'pt')) patchwork::wrap_plots(p1, p2, ncol = 1)
尝试过以下方法,但都无法满足需求:
- 使用
free()参数:能让两图整体宽度对齐,图例和面板遵循各自设置,但面板本身无法对齐patchwork::wrap_plots(free(p1), free(p2), ncol = 1) - 使用
guides='collect':结果接近预期,但图例无法与对应子图对齐patchwork::wrap_plots(p1, p2, ncol = 1, guides = 'collect')
请问是否存在方法,既能让子图的面板对齐,又能确保每个子图的图例固定在其自身面板的指定位置?
编辑1:多层
wrap_plots嵌套时主题设置失效问题 实际使用多栅格数据拼接时,多层嵌套wrap_plots会出现对齐异常,是否应该避免多次使用wrap_plots?
复现代码如下:
library(ggplot2) library(terra) library(tidyterra) library(patchwork) # 栅格数据 r1 <- rast(nrow = 10, ncol = 10) values(r1) <- 1:ncell(r1) r2 <- r1 * r1 rr <- c(r1, r2) |> `names<-`(c("r1", "r2")) p1 <- ggplot() + geom_spatraster(data = rr) + facet_wrap(~lyr) p2 <- ggplot() + geom_spatraster(data = r1) + facet_wrap(~lyr) p3 <- ggplot() + geom_spatraster(data = rr / 10) + facet_wrap(~lyr) p4 <- ggplot() + geom_spatraster(data = r2) + facet_wrap(~lyr) design = 'aab ccd' # 直接合并时正常,图例左对齐符合预期 patchwork::wrap_plots(p1, p2, p3, p4, ncol = 2, design = design) & theme( legend.box.background = element_rect(color = 'red'), legend.justification = 'left' )
但多层嵌套后,即使使用&而非*,主题设置也无法作用于所有子图:
sub1 <- wrap_plots(p1, p2, design = 'aab') sub2 <- wrap_plots(p3, p4, design = 'aab') wrap_plots(sub1, sub2, ncol = 1) & theme( legend.box.background = element_rect(color = 'blue'), legend.justification = 'left' )
内容的提问来源于stack exchange,提问作者Breeze
相关产品推荐
相关产品推荐

